我正在尝试创建一个基本搜索,该搜索将从Mongo数据库返回结果.查询应匹配完整值或该值内的值.例如,对C的搜索应返回C,C#,C.此外,Java应该同时返回Java和Javascript.目前,我有一个可以实现此目的的简单实现,但是,如果我搜索查询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 = ++.在查询中传递时会发生什么情况,如何减轻它产生的内部服务器错误?
最佳答案
在regex中的值为special meaning,因此不能以形式使用.您需要转义正则表达式.
原文链接:https://www.f2er.com/js/531105.htmlfunction 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