我正在尝试创建一个将从 Mongo 数据库返回结果的基本搜索。查询应匹配完整值或值内的值。例如,搜索 C
应该返回 C, C#, C++
.此外,Java
应该同时返回 Java, Javascript
.我目前设置了一个简单的实现可以完成此操作,但是如果我搜索查询 C++
,返回时出现内部服务器错误。搜索 C+
将返回 C++
的成功搜索正在上市。这只发生在 ++
在查询中,因为使用双特殊字符 ( //, --, $$, etc.
) 的搜索将成功返回。
我尝试使用 Javascript RegExp
功能来完成这个,但是我是正则表达式的新手,并且确信这是我的问题的根源。当前实现
- 从输入中获取搜索查询并对其进行编码
- 将查询传递给应用
RegExp
的 Controller 功能 - 根据数据库查找结果并将结果返回到 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;
}
Controller
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);
}
});
};
我读过 ++
in Regex 是一个所有格量词,这样如果引擎匹配失败,就不会返回并尝试撤消它所做的匹配。但是,当查询到达 RegExp 函数时,它被编码为 /items/search?search=%2B%2B
. ++
时发生了什么在查询中传递,如何减轻它产生的内部服务器错误?
最佳答案
+
有一个 special meaning在 regex并且不能以 ++
的形式使用。您需要转义正则表达式。
使用这个功能 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
旁注:允许用户搜索原始输入是一个非常糟糕的主意。
关于javascript - 为什么我的 Regex 使用 "++"而不是任何其他特殊字符组合创建内部服务器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54222271/