0

StackOverflow の別の場所で、このコードのバリエーションを見つけました。テキストエリアからすべての単語を取得し、それらを正規表現に変換します。次に、配列をテストして、正規表現のすべての単語が配列に含まれているかどうかを確認します。

<textarea id="inputtext" type="text"></textarea>
<input id="searchbutton" type="button" value="Click me" />

var links = new Array("taxi","Alpha","runway");


$("#searchbutton").click(function () {
    var query = $("#inputtext").val();
    var querywords = query.split(',');

    for (var i = 0; i < querywords.length; i++) {
        var regex = new RegExp('(?=.*\\b' + querywords[i].split(' ').join('\\b)(?=.*\\b')    + '\\b)', 'i', 'g');
        for (var j = 0; j < links.length; j++) {
            if (regex.test(links[j])) {                      
                console.log("Correct");
            }
        }
    }
});

テキストエリアの単語に配列内のすべてのキーワードが含まれている場合、プログラムが「true」を返すようにプロセスを逆にするにはどうすればよいですか? たとえば、テキストエリアに「Taxi to the runway via Taxiway alpha」という文があり、「links」という名前の配列にキーワード「taxi」「alpha」および「runway」が含まれている場合、プログラムは「true」を返します。

4

3 に答える 3

3

あなたが持っているそのスクリプトは、単語のいずれかが配列のどこかに現れるかどうかをチェックするようです。必要なのはeveryArray メソッドです:

var text = "Taxi to the runway via taxiway alpha",
    links = ["taxi", "alpha", "runway"];

console.log( links.every(function(word) {
    return new RegExp("\\b"+word+"\\b", "i").test(text);
}) ); // true
于 2013-09-13T13:02:19.560 に答える
1

他の回答で提供される方法は単純ですが、より効率的である可能性があります。毎回配列全体を検索するのではなく、オブジェクトをマップとして使用してルックアップを高速化する方がほとんどの場合優れています。

var words = ['word1', 'word2'],
    wordsMap = 'text area content, word1 and word2'.split(/\W+/).reduce(function (obj, word) {
        obj[word] = true;
        return obj;
    }, {}),
    areWordsAllContained = words.every(function (word) {
        return wordsMap[word.toLowerCase()];
    });

console.log(areWordsAllContained); //true

編集:単語以外のすべての文字で分割されるように、分割正規表現を から\s+に変更しました。\W+

于 2013-09-13T13:19:37.400 に答える
1

正規表現以外の方法は次のとおりです。

var arr = ['word1', 'word2'], haystack = textArea.value.toLowerCase().split(/\s+/);
var result = true, i = 0;
for(i=0; i<arr.length; i++) {
    if(haystack.indexOf(arr[i].toLowerCase()) === -1) {
        result = false;
        break;
    }
}
于 2013-09-13T13:01:58.103 に答える