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