我有一些要素:
<p>Windows Phone 7</p>
<p>Windows Phone 7.5 "Mango"</p>
<p>Phone Windows 7</p>
Phone 7
,则应返回所有结果。7 Windows
,则应返回所有结果。"Phone Windows"
,它应该只返回最后一个元素。用户基本上会在input
中输入一些文字,我希望用正则表达式实现AND
和OR
。
我该如何实现?
答案 0 :(得分:1)
您需要解析查找文本并从部件构造正则表达式。首先,找到/"[^"]+"/g
的所有短语并删除引号。接下来,从查找文本中删除短语,并通过拆分空格来查找所有剩余的单词:/\s+/
。然后连接两个数组并连接以创建一个新的正则表达式,其中每个搜索项都包含在正向前瞻语法中:(?=.*SearchTerm)
。最后,使用该正则表达式来测试给定文本是否匹配。这是一个搜索功能:
function search(find, within) {
find = find.replace(/[*+?^$.\[\]{}()|\\\/]/g, "\\$&");
var phrase = /"[^"]+"/g;
var phrases = find.match(phrase) || [];
phrases = $.map(phrases, function(s) {
return s.replace(/"/g, "");
});
var words = find.replace(phrase, "").split(/\s+/);
var terms = words.concat(phrases);
var searchExpression = new RegExp("(?=.*" + terms.join(")(?=.*") + ").+", "i");
return searchExpression.test(within);
}
使用一些jQuery将其绑定到您的页面:
$(function() {
$("#searchButton").click(function() {
var searchText = $("#searchInput").val();
$("p").removeClass("matchesSearch").filter(function() {
return search(searchText, $(this).text());
}).addClass("matchesSearch");
});
});
它在这里工作:http://jsfiddle.net/gilly3/DVxem/
编辑:也可以在这里使用修复程序来转义正则表达式元字符:http://jsfiddle.net/gilly3/DVxem/3/
答案 1 :(得分:0)
基于skeleton code的IAbstractDownvoteFactory:
var search = $('#text').val(),
filter;
if (search.match(/^"(.+)"$/)) {
search = search.match(/^"(.+)"$/)[1].toLowerCase();
filter = function() {
return $(this).text().toLowerCase().indexOf(search) != -1;
};
} else {
var words = search.split(" ");
filter = function() {
for (var i=0; i != words.length; i++) {
if ($(this).text().toLowerCase().indexOf(words[i]) == -1) {
return false;
}
}
return true;
}
}
$('p').css({color: 'black'}).filter(filter).css({
color: 'red'
});