Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的正则表达式会创建一个内部服务器错误++&引用;但是没有其他特殊字符的组合?_Javascript_Regex - Fatal编程技术网

Javascript 为什么我的正则表达式会创建一个内部服务器错误++&引用;但是没有其他特殊字符的组合?

Javascript 为什么我的正则表达式会创建一个内部服务器错误++&引用;但是没有其他特殊字符的组合?,javascript,regex,Javascript,Regex,我正在尝试创建一个基本搜索,它将从Mongo数据库返回结果。查询应匹配完整值或值内的值。例如,搜索C应该返回C,C#,C++。另外,Java应该同时返回Java和Javascript。我目前设置了一个简单的实现,可以实现这一点,但是如果搜索查询C++,则返回一个内部服务器错误。搜索C++将返回成功的搜索,并列出C++。这仅在查询中使用++时发生,因为使用双特殊字符(/,-,$$等)的搜索将成功返回 我曾尝试使用JavascriptRegExp函数来实现这一点,但是我对regex是新手,我确信这就

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

我曾尝试使用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);
            }
       });
    };
    
    我已经读到正则表达式中的
    ++
    是一个所有格量词,因此如果引擎匹配失败,它将不会返回并尝试撤消匹配。但是,当查询到达RegExp函数时,它被编码为
    /items/search?search=%2B%2B
    。在查询中传递
    ++
    时会发生什么情况?我如何减轻它产生的内部服务器错误?

    ++
    具有in,不能以
    ++
    的形式使用。你需要逃离正则表达式

    使用此功能:

    您可以替换:

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

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

    SyntaxError:没有要重复的内容



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

    如果您想按字面意思使用+来匹配加号字符,您需要在模式中使用
    \
    对其进行转义。直接从用户输入构建
    RegExp
    是多么危险,我再强调也不过分。这使您的服务器容易受到DDoS攻击。这非常有效,谢谢。正如你和其他人所说,这最终(非常)是一种糟糕的做法。有什么更好的方法可以使用?好吧,@Ryan,逃避它将保护您免受DDoS攻击,这是一个很好的第一步。
    var regexEx = new RegExp(req.query.search, "i"); //ignore case
    
    var regexEx = new RegExp(escapeRegExp(req.query.search), "i"); //ignore case
                             ^^^^^^^^^^^^