2016-06-09 4 views
-1

мой вызов описан в следующем примере: приведена комбинация ключевых слов «игровой ноутбук».PHP проверить, есть ли два слова в строке

Я хочу проверить, происходят ли два слова в строке. Наша задача в том, что строка может выглядеть следующим образом:

«Хороший игровой ноутбук» «ноутбук для игр» «ноутбука для экстремальных игр»

Я хочу, чтобы моя функция возвращает истину для всех трех строк , Существует толерантность в 3-4 слова, которая может быть между комбинацией слов, и, как показывают примеры, я хочу, чтобы она работала, если ключевые слова переключаются.

Так что мой подход был следующим, но это не похоже на работу:

$keyword = strtolower("gaming notebook"); 
$parts = explode(" ", $keyword); 

$string = strtolower("Which notebook for good gaming performance"); 
//point to end of the array 
end($parts); 
//fetch key of the last element of the array. 
$lastElementKey = key($parts); 
//iterate the array 
$searchExpression = ""; 
foreach($parts as $k => $v) { 
    if($k != $lastElementKey) { 
     $searchExpression .= $v . "|"; 
    } else { 
     $searchExpression .= $v; 
    } 
} 

if(preg_match_all('#\b('. $searchExpression .')\b#', $string, $matches) > 0) { 
    echo "Jep, keyword combination is in string"; 
} else { 
    echo "No, keyword combination is not in string"; 
} 
+0

ли допуск требование? –

+0

Эй, Робби, да, это должно возвратиться, даже если одно или два слова (или 20 символов) находятся между двумя ключевыми словами. –

ответ

0

Вы хотите использовать что-то вроде CMU Sphinx или индекс естественного языка в вашей базе данных. (См. http://dev.mysql.com/doc/refman/5.7/en/fulltext-natural-language.html). В результате быстрого поиска библиотек php появились «nlp-tools/nlp-tools», однако я никогда не использовал чистое php-решение для выполнения того, что вы пытаетесь сделать.

0

Раствор с помощью preg_match_all и array_intersect функции:

$keywordStr = "gaming notebook"; 
$string = "Which notebook for good gaming performance,it's my notebook"; 
$keywords = explode(" ", $keywordStr); 
$parts = implode("|", $keywords); 

preg_match_all("/\b$parts\b/i", $string, $matches); 
// matched items should contain all needed keywords 
if (count($keywords) == count(array_intersect($keywords, $matches[0]))) { 
    echo "Jep, keyword combination is in string"; 
} else { 
    echo "No, keyword combination is not in string"; 
} 
+0

Спасибо, Roman, теперь он отлично проверяет, все ли ключевые слова находятся в строке. У вас есть идея, что сценарий может возвращать true, если не более двух или трех слов между ключевыми словами. Предположим, что «ноутбук для экстремальных игр» возвращает true, но «ноутбук для множества обширных игр» возвращает false. –

0
<?php 

$keyword = strtolower("gaming notebook"); 
$string = strtolower("Which notebooks for good gaming performance"); 
function check($keyword,$string){ 
    $parts = explode(' ',$keyword); 
    $result = false; 
    $pattern = implode('|',$parts); 
    preg_match_all("(\b{$pattern}\b)",$string,$matches); 
    if(isset($matches[0])){ 
     return true; 
    } 

    return false; 
} 

var_dump(check($keyword, $string)); 
0
$reg = "/(?:\b$kw1(?:\s+\w+){0,4}\s+$kw2\b)|(?:\b$kw2(?:\s+\w+){0,4}\s+$kw1\b)/"; 
if (preg_match($reg, $string)) { 
    echo "OK\n"; 
} else { 
    echo "KO\n"; 
} 

Это эхо ОК, когда 2 ключевые слова встречаются в строке, в любом порядке и разделены не более 4 слов.

Объяснение:

/ 
    (?:    : non capture group 
    \b$kw1   : keyword 1 
    (?:\s+\w+){0,4} : followed by 0 to 4 other word 
    \s+    : space(s) 
    $kw2\b   : keyword 2 
) 
| 
    (?:    : non capture group 
    \b$kw2   : keyword 2 
    (?:\s+\w+){0,4} : followed by 0 to 4 other word 
    \s+    : space(s) 
    $kw1\b   : keyword 1 
) 
/

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

  • Нет связанных вопросов^_^