Javascript-为什么我的Regex用“”创建内部服务器错误,但没有其他特殊字符组合?

我正在尝试创建一个基本搜索,该搜索将从Mongo数据库返回结果.查询应匹配完整值或该值内的值.例如,对C的搜索应返回C,C#,C.此外,Java应该同时返回JavaJavascript.目前,我有一个可以实现此目的的简单实现,但是,如果我搜索查询C,则返回内部服务器错误.搜索C将返回成功搜索,并列出C.这仅在查询中与a一起发生,因为使用双特殊字符(//,-,$$等)的搜索将成功返回.

我尝试使用Javascript RegExp函数来完成此操作,但是我对regex并不陌生,并且可以确定这是我的问题所在.当前执行

>从输入中获取搜索查询并对其进行编码
>将查询传递给应用RegExp函数的控制器
>根据数据库查找结果,并以JSON对象返回结果

AJAX搜寻电话

function getSearchResults() {
    var query = $("#searchInput").val(); //search value
    if(query === '') {
        return false;
    } else {
        $.ajax({
            url: '/items/search?search=' + encodeURIComponent(query),//url with search query
            type: 'GET',dataType: 'json',beforeSend: function() {
                $('#loadingOverlay').css('visibility','visible');
            },success: function(result) {
                $('#itemContentMain').bootstrapTable({data: result});
                $('#itemContentMain').bootstrapTable('load',result);
                $('#loadingOverlay').css('visibility','hidden');
            }
        }).fail(function (xhr,ajaxOptions,thrownError){
            alert("The search failed to return results: " + thrownError);
        });
    }
    return false;
}

控制者

itemController.search = function(req,res) {
    var regexEx = new RegExp(req.query.search,"i"); //ignore case
    Item.find({ $or: [{name: regexEx},{category: regexEx},{subcategory: regexEx},{status: regexEx},{description: regexEx}]}).exec(function (err,items) {
        if (err) {
            console.log("Error:",err);
        } else {
            console.log("Search returning results");
            res.send(items);
        }
   });
};

我已经读过,正则表达式中的a是所有格量词,因此,如果引擎匹配失败,将不会返回并尝试撤消所做的匹配.但是,当查询到达RegExp函数时,它将被编码为/ items / search?search = ++.在查询中传递时会发生什么情况,如何减轻它产生的内部服务器错误?

最佳答案
中的值为special meaning,因此不能以形式使用.您需要转义正则表达式.

使用此功能source

function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g,'\\$&'); // $& means the whole matched string
}

您可以替换:

var regexEx = new RegExp(req.query.search,"i"); //ignore case

var regexEx = new RegExp(escapeRegExp(req.query.search),"i"); //ignore case
                         ^^^^^^^^^^^^

您可以通过在浏览器的控制台中创建一个简单的正则表达式/ c /来轻松地重复此错误,它将抛出以下消息(可能因浏览器而异):

SyntaxError: nothing to repeat

旁注:这是一个非常糟糕的主意,不允许用户搜索原始输入.

相关文章

kindeditor4.x代码高亮功能默认使用的是prettify插件,prett...
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代...
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小