如何使用正则表达式实现搜索?

时间:2011-09-20 23:19:42

标签: javascript jquery regex

我有一些要素:

<p>Windows Phone 7</p>
<p>Windows Phone 7.5 "Mango"</p>
<p>Phone Windows 7</p>
  1. 如果我搜索Phone 7,则应返回所有结果。
  2. 如果我搜索7 Windows,则应返回所有结果。
  3. 如果我搜索"Phone Windows",它应该只返回最后一个元素。
  4. 用户基本上会在input中输入一些文字,我希望用正则表达式实现ANDOR

    我该如何实现?

2 个答案:

答案 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 codeIAbstractDownvoteFactory

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'
});

演示:http://jsfiddle.net/kVUJj/3/