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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)