2016-12-09 4 views
3

Как проверить, содержит ли строка из выбранных ключевых слов?JavaScript/jQuery - проверьте, содержит ли строка одно из ключевых слов

Например

var keywords = 'small, big, large' 
var string = 'big brown bear'; 

function wordInString(string, keywords){ 
    return new RegExp('\\b' + keywords + '\\b', 'i').test(string); 
} 

выше работает только для одного слова, мне нужно, чтобы быть в состоянии проверить несколько слов, и точное совпадение.

+0

когда вы говорите несколько слов, то порядок слов не имеет значения RYT? –

+0

Правильно, порядок не важен. – Alko

+0

Также, если все присутствуют только тогда, вам необходимо вернуться или даже если найдено одно слово, то нужно вернуться? –

ответ

4

Разделить строку на слова, и использовать массив ключевых слов

function wordInString(string, keywords) { 
 
    return string.split(/\b/).some(Array.prototype.includes.bind(keywords)); 
 
} 
 

 
var keywords = ['small', 'big', 'large']; 
 
var result1 = wordInString('big brown bear', keywords); // true 
 
var result2 = wordInString('great brown bear', keywords); // false 
 
var result3 = wordInString('Big brown bear', keywords); // false 
 

 
console.log(result1, result2, result3);

ES5 (кросс-браузер) версия

function wordInString(string, keywords) { 
    return string.split(/\b/).filter(function(w) { 
     return keywords.indexOf(w) !== -1; 
    }).length > 0; 
} 

Чтобы вернуть все слова

function wordInString(string, keywords) { 
 
    return keywords.filter(function(x) { return this.includes(x) }, string.split(/\b/)); 
 
} 
 

 
var keywords = ['small', 'big', 'large']; 
 
var result1 = wordInString('big brown bear large', keywords); // ["big", "large"] 
 
var result2 = wordInString('great brown bear', keywords);  // [] 
 
var result3 = wordInString('Big brown bear', keywords);  // [] 
 

 
console.log(result1); 
 
console.log(result2); 
 
console.log(result3);

Чтобы вернуть первое найденное слово или пустой строку

function wordInString(string, keywords) { 
 
\t var r = ""; 
 
    string.split(/\b/).some(x => { 
 
    \t return r = keywords.includes(x) ? x : ""; 
 
    }) 
 
    return r; 
 
} 
 

 
var keywords = ['small', 'big', 'large']; 
 
var result1 = wordInString('big brown bear large', keywords); // "big" 
 
var result2 = wordInString('great brown bear', keywords);  // "" 
 
var result3 = wordInString('Big brown bear', keywords);  // "" 
 

 
console.log(result1); 
 
console.log(result2); 
 
console.log(result3);

+0

Я получаю сообщение об ошибке в firebug 'TypeError: Array.prototype.включает undefined ' – Alko

+0

@Alko - ваш браузер не обновлен, Firefox поддерживает 'includes' с версии 43 и выше, добавила также версию ES5. – adeneo

+0

Хорошо, вторая версия ES5 работает нормально, только одна проблема, она возвращает true/false, мне нужно вернуть фактическое ключевое слово if true или пустую строку, если false. – Alko

1

Используйте массив ключевых слов, и цикл через них:

var keywords = ['small', 'big', 'large']; 
 

 
console.log(wordInString("big brown bear", keywords));   // true 
 
console.log(wordInString("it's small!", keywords));    // true 
 
console.log(wordInString("it's larger than the other", keywords));// false 
 
console.log(wordInString("it's black and red", keywords));  // false 
 

 
function wordInString(string, keywords){ 
 
    for(var i=0; i<keywords.length; i++){ 
 
    if(new RegExp('\\b' + keywords[i] + '\\b', 'i').test(string)){ 
 
     return true; 
 
    } 
 
    } 
 
    return false; 
 
}

0

Вот другое решение, использующее map, reduce функции и logical operators.

var keywords = 'small, big, large' 
 
var test1 = testString('big brown bear', keywords); //big 
 
var test2 = testString('great brown bear', keywords); // empty 
 
var test3 = testString('Big brown bear', keywords); // empty 
 
function wordInString(string, keywords){ 
 
    return new RegExp('\\b' + keywords + '\\b').test(string); 
 
} 
 

 
function testString(string,keywords){ 
 
    var word='empty'; 
 
    var result=keywords.split(',').map(function(item){ 
 
     if(wordInString(string,item.trim())==true) 
 
      word=item.trim(); 
 
     return wordInString(string,item.trim()); 
 
    }).reduce(function(curr,prev){ 
 
     return curr || prev; 
 
    }); 
 
    return word; 
 
} 
 
console.log(test1) 
 
console.log(test2) 
 
console.log(test3)

+0

@ Алко, пожалуйста, взгляните на мой ответ. –

0

Split ключевые слова, а затем поиск indexOf ключевых слов на строке.

var keywords = 'small, big, large' 
 
var string = 'big brown bear'; 
 

 
function wordInString(string, keywords) { 
 
    return keywords.split(',').some(function(keyword) { 
 
    return string.indexOf(keyword.trim()) == -1 ? false : true 
 
    }); 
 
    //return new RegExp('\\b' + keywords + '\\b', 'i').test(string); 
 
} 
 

 
console.log(wordInString(string, keywords)) 
 
console.log(wordInString(string, "xyz, abc")) 
 
console.log(wordInString("'a large bear'", "large, none"))

1

Возвращает соответствие слова или предустановленную строку, если не найдено.

function wordInString(string, keywords) { 
 
    return string.split(/\b/).filter(word => keywords.some(w => w === word))[0] || 'empty'; 
 
} 
 

 
var keywords = ['small', 'big', 'large']; 
 
var result1 = wordInString('big brown bear', keywords); // big 
 
var result2 = wordInString('tiny bear', keywords); // empty 
 
var result3 = wordInString('huge hairy bear', keywords); // empty 
 

 
console.log(result1, result2, result3);

Смежные вопросы