簡體   English   中英

為什么我的正則表達式使用“++”而不是任何其他特殊字符組合創建內部服務器錯誤?

[英]Why does my Regex create an internal server error with “++” but not any other combination of special characters?

我正在嘗試創建一個基本搜索,它將返回Mongo數據庫的結果。 查詢應匹配值為完整值或值。 例如,搜索C應該返回C, C#, C++ 此外, Java應該返回Java, Javascript 我有一個簡單的實現當前設置可以實現這一點,但是如果我搜索查詢C++ ,我返回內部服務器錯誤。 搜索C+將返回列出C++的成功搜索。 這僅在查詢中使用++時發生,因為具有雙特殊字符( //, --, $$, etc. )的搜索將成功返回。

我曾嘗試使用Javascript RegExp函數來完成此任務,但我是regex的新手,並且我確信這是我的問題所在。 目前的實施

  1. 從輸入中獲取搜索查詢並對其進行編碼
  2. 將查詢傳遞給應用RegExp函數的控制器
  3. 查找數據庫的結果並將結果返回給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);
        }
   });
};

我已經讀過Regex中的++是一個占有量詞,所以如果引擎失敗匹​​配,就不會回去嘗試撤消它所做的匹配。 但是,當查詢到達RegExp函數時,它被編碼為/items/search?search=%2B%2B 在查詢中傳遞++時會發生什么,以及如何緩解它產生的內部服務器錯誤?

+特殊含義 ,不能以++格式使用。 你需要逃避正則表達式。

使用此功能來源

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:沒有什么可重復的


旁注 :允許用戶搜索原始輸入是一個非常糟糕的主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM