【问题标题】:Javascript search for words that are not in sequenceJavascript 搜索不按顺序排列的单词
【发布时间】:2012-01-08 02:48:24
【问题描述】:

我是 Javascript 的新手。

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

我有以下代码,目前当我在搜索中键入短语“蓝色小部件”时,如果短语“蓝色小部件”按顺序退出,它只会识别/查找复选框。例如,如果我有一个包含“blue cool 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>

【问题讨论】:

    标签: javascript search


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      /(?=.*blue)(?=.*widgets)/.test( phrase );
      

      (?=...) 是一个前瞻,这意味着它仅在表达式在字符串中的某个位置匹配时才匹配。好的部分是它不消耗匹配,所以上面的内容只有在字符串后面的某个时刻有“blue”和“widgets”时才会匹配,但顺序无关紧要.

      如有必要,请随意修改它们以用空格换行,以便它只匹配整个单词(例如,用 \b 换行)

      动态生成该正则表达式:

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

      【讨论】:

      • 我忘了说上面的代码不是我的,但有人帮我解决了这个问题。我是个新手,请问你能告诉我 RegExp 代码在现有代码中的位置吗?
      • 对不起,我不知道如何实施您的建议。您能否根据您的建议修改我的代码。我对javascript很陌生。感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      相关资源
      最近更新 更多