Как проверить, существует ли слово в предложении - PullRequest
5 голосов
/ 10 ноября 2011

Например, если мое предложение $sent = 'how are you'; и если я ищу $key = 'ho' с использованием strstr($sent, $key), оно вернет true, потому что в моем предложении ho.

То, что я ищу, это способ вернуть истину, если я только ищу, как, вы или вы. Как я могу это сделать?

Ответы [ 5 ]

7 голосов
/ 10 ноября 2011

Вы можете использовать функцию preg-match, которая использует регулярное выражение с границами слов :

if(preg_match('/\byou\b/', $input)) {
  echo $input.' has the word you';
}
6 голосов
/ 10 ноября 2011

Если вы хотите проверить наличие нескольких слов в одной строке и имеете дело с большими строками, тогда это быстрее:

$text = explode(' ',$text);
$text = array_flip($text);

Тогда вы можете проверить слова с помощью:

if (isset($text[$word])) doSomething();

Этот метод молниеносен.

Но для проверки пары слов в коротких строках используйте preg_match.

ОБНОВЛЕНИЕ:

Если вы действительно собираетесь использовать это, я предлагаю вам реализовать его следующим образом, чтобы избежать проблем:

$text = preg_replace('/[^a-z\s]/', '', strtolower($text));
$text = preg_split('/\s+/', $text, NULL, PREG_SPLIT_NO_EMPTY);
$text = array_flip($text);

$word = strtolower($word);
if (isset($text[$word])) doSomething();

Тогда двойные пробелы, переносы строк, знаки препинания и прописные буквы не будут давать ложных отрицаний.

Этот метод намного быстрее проверяет наличие нескольких слов в больших строках (т. Е. Целых документов текста), но более эффективно использовать preg_match, если все, что вам нужно, - это найти, существует ли одно слово нормального размера.строка.

3 голосов
/ 10 ноября 2011

Одна вещь, которую вы можете сделать, это разбить ваше предложение пробелами на массив.

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

$sent = preg_replace("/[^a-zA-Z 0-9]+/", " ", $sent);

Теперь все, что у вас есть, это слова, разделенные пробелами.Чтобы создать массив, который разделяется на пробел ...

$sent_split = explode(" ", $sent);

Наконец, вы можете проверить.Здесь все шаги объединены.

// The information you give
$sent = 'how are you';
$key  = 'ho';

// Isolate only words and spaces
$sent = preg_replace("/[^a-zA-Z 0-9]+/", " ", $sent);
$sent_split = explode(" ", $sent);

// Do the check
if (in_array($key, $sent))
{
    echo "Word found";
}
else
{
    echo "Word not found";
}

// Outputs: Word not found
//  because 'ho' isn't a word in 'how are you'
1 голос
/ 10 ноября 2011

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

$searchWord = $_GET['search'];
$searchWord = preg_quote($searchWord);

if (preg_match("/\b$searchWord\b", $input) {
  echo "$input has the word $searchWord";
}
0 голосов
/ 17 декабря 2012

С учетом ответа Абхи есть пара предложений:

  1. Я добавил / i к регулярному выражению, поскольку слова предложения, вероятно, обрабатываются без учета регистра
  2. Iдобавил явное === 1 к сравнению на основе задокументированных возвращаемых значений preg_match

    $needle = preg_quote($needle);
    return preg_match("/\b$needle\b/i", $haystack) === 1;
    
...