Javascript搜索不按顺序排列的单词

时间:2012-01-08 02:48:25

标签: javascript search

对于Javascript,我是新手。

我想在下面提供的脚本中改进搜索。

我有以下代码,目前当我在搜索中输入短语'blue widgets'时,如果短语'blue widgets'按顺序退出,它将只识别/找到复选框。例如,如果我有一个包含“蓝色小部件”的关键字短语或句子,并且我搜索“蓝色小部件”,则无法找到它,即使蓝色和小部件都存在于我的关键字短语中。

如果我搜索其中包含2个甚至3个单词的短语,那么它可以在我的页面上找到任何关键词短语/句子,其中我的搜索短语的所有单词都存在,然后选中该复选框(代码已经做了)。唯一的条件是我的搜索短语的所有单词都必须存在于句子/字符串中?

如果能找到这个解决方案,我将非常感激。

<html>
<head>
<script type="text/javascript">
function checkForWord( wordField )
{
var form = wordField.form;
var word = wordField.value.replace(/^\s+/,"").replace(/\s+$/,"").toLowerCase();

var inputs = form.getElementsByTagName("input");
for ( var e = 0; e < inputs.length; ++e )
{
    var field = inputs[e];
    if ( field.type == "checkbox" )
    {
        if ( field.value.toLowerCase().indexOf(word) >= 0 )
        {
            field.checked = true;
        } else {
            // OPTIONAL, if you do NOTwant to clear previously checked boxes, omit next              line:
            field.checked = false;
        }
    }
}
}
</script>
</head>
<body>
<form onsubmit="return false;">
Type a word: <input name="word" onchange="checkForWord(this);" />
<hr>
<label>
<input type="checkbox" name="keywords" value="This is an example sentence with blue and     cool widgets not in order and my current script will not find it.
</label></br/>
<label>
<input type="checkbox" name="keywords" value="This sentence will be found if I search for blue widgets because its in this sentence">
All work and no play makes Jack
</label></br/>
<label>
<input type="checkbox" name="keywords" value="I would like for it to be able to find this sentence also since blue and widgets both words exist but are out of order. 
</label></br/>    
</form>
</body>
</html>

2 个答案:

答案 0 :(得分:0)

最好对搜索字符串进行标记(用单词分割),独立执行每个搜索(对于每个单词),然后合并结果。

答案 1 :(得分:0)

/(?=.*blue)(?=.*widgets)/.test( phrase );

(?=...)是一个预测,意味着它只在表达式在字符串中的某个位置匹配时才匹配。好的部分是它不会消耗匹配,所以只有在字符串后面的某个点上有“蓝色”和“小部件”时才会匹配,但顺序无关紧要

如果需要,可以随意修改那些用空格包装的内容,以便它只匹配整个单词(例如用\b包装单词)

动态生成该正则表达式:

var words = 'blue widgets';
new RegExp( '(?=.*' + words.split( /\W+/g ).join( ')(?=.*' ) + ')', 'i' )