我有一个流星应用程序,为此我添加了搜索源程序包以搜索某些集合,并且它部分起作用。也就是说,当我搜索术语foo bar
时,它会返回“ foo”和“ bar”中每一个的结果。很好,但是我还希望能够用以下方式将这些术语用引号引起来:"foo bar"
,并仅获得完全匹配的结果。当我这样做的时候,我得到了一个空集。这是我的服务器代码:
//Server.js
SearchSource.defineSource('FruitBasket', function(searchText, options) {
// options = options || {}; // to be sure that options is at least an empty object
if(searchText) {
var regExp = buildRegExp(searchText);
var selector = {$or: [
{'fruit.name': regExp},
{'fruit.season': regExp},
{'fruit.treeType': regExp}
]};
return Basket.find(selector, options).fetch();
} else {
return Basket.find({}, options).fetch();
}
});
function buildRegExp(searchText) {
// this is a dumb implementation
var parts = searchText.trim().split(/[ \-\:]+/);
return new RegExp("(" + parts.join('|') + ")", "ig");
}
和我的客户代码:
//Client.js
Template.dispResults.helpers({
getPackages_fruit: function() {
return PackageSearch_fruit.getData({
transform: function(matchText, regExp) {
return matchText.replace(regExp, "<b>$&</b>")
},
sort: {isoScore: -1}
});
}
});
谢谢!
答案 0 :(得分:1)
我已经修改了.split
模式,以便它忽略双引号之间的所有内容。
/[ \-\:]+(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/
因此,您只需将精确的词组搜索用双引号括起来,就不会拆分。
还有一件事;由于我们不需要引号,因此可以在下一行中使用带有正则表达式的.map
函数将其删除,该正则表达式将替换字符串部分开头或结尾的双引号:/^"|"$/
示例代码:
function buildRegExp(searchText) {
// exact phrase search in double quotes won't get split
var arr = searchText.trim().split(/[ \-\:]+(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/);
var parts = arr.map(function(x){return x.replace(/^"|"$/g, '');});
return new RegExp("(" + parts.join('|') + ")", "ig");
}
console.log(buildRegExp("foo bar"));
console.log(buildRegExp("\"foo bar\""));