Как найти полные слова только в строке
<?php $str ="By ILI LIKUALAYANA MOKHTAKUALAR AND G. SURACH Datuk Dr Hasan Ali says he has no intention of joining Umno. Pic by Afendi Mohamed KUALA LUMPUR: FORMER Selangor Pas commissioner Datuk Dr Hasan Ali has not ruled out the possibility of returning to Pas' fold"; $search ="KUALA"; ?>
Чтобы узнать, находится ли конкретное слово в строке, вы можете использовать регулярное выражение с границами слов, например:
$str = "By ILI LIKUALAYANA MOKHTAKUALAR AND G. SURACH Datuk Dr Hasan Ali says he has no intention of joining Umno. Pic by Afendi Mohamed KUALA LUMPUR: FORMER Selangor Pas commissioner Datuk Dr Hasan Ali has not ruled out the possibility of returning to Pas' fold"; $search = "KUALA"; if (preg_match("/\b$search\b/", $str)) { // word found }
Здесь \b
означает «граница слова». Он фактически не соответствует никаким символам, только границам, поэтому он соответствует краю между словами и пробелами, а также соответствует краям в концах строк.
Если вам нужно сделать его нечувствительным к регистру, вы можете добавить i
в конец строки соответствия следующим образом: "/\b$search\b/i"
.
Если вам нужно знать, где в строке был результат, вы можете добавить третий параметр $matches
matches, который дает сведения о совпадении, например:
if (preg_match("/\b$search\b/", $str, $matches)) { // word found $position = $matches[1]; }
Просто разделите строку:
$words = explode(' ',$str); if (in_array($search,$words)){ echo "FOUND!"; }
Или, если вам нужно место:
$words = explode(' ',$str); $exists_at = array_search($seach,$words); if ($exists_at){ echo "Found at ".$exists_at." key in the \$word array"; }
В свете борьбы с регулярным выражением re-regex, идущей здесь, я должен отменить этот ответ и отложить до толпы регулярных выражений, но я собираюсь оставить его для записи истории. Я всегда полагал, что работа с массивами была более эффективной с точки зрения обработки, но я решил провести несколько тестов, и оказалось, что мое предположение было неправильным. Результат теста на одно слово:
Time to search for word 10000 times using in_array(): 0.011814 Time to search for word 10000 times using preg_match(): 0.001697
Код, который я использовал для тестирования (который предполагает, что взорваться будет использоваться каждый раз):
$str ="By ILI LIKUALAYANA MOKHTAKUALAR AND G. SURACH Datuk Dr Hasan Ali says he has no intention of joining Umno. Pic by Afendi Mohamed KUALA LUMPUR: FORMER Selangor Pas commissioner Datuk Dr Hasan Ali has not ruled out the possibility of returning to Pas' fold"; $search ="KUALA"; $start = microtime(true); for($i=0;$i<1000;$i++){ $words = explode(' ',$str); if (in_array($search,$words)){ // } } $end = microtime(); $total = $end-$start; echo "Time to search for word 10000 times using in_array(): "; echo $total; echo "<br />"; $start = microtime(true); for($i=0;$i<1000;$i++){ if (preg_match("/\b$search\b/", $str)) { // word found } } $end = microtime(); $total = $end-$start; echo "Time to search for word 10000 times using preg_match(): "; echo $total;
Итак, сделайте вывод: перейдите с preg_match ("/ \ b $ search \ b /", $ str)
$str ="By ILI LIKUALAYANA MOKHTAKUALAR AND G. SURACH Datuk Dr Hasan Ali says he has no intention of joining Umno. Pic by Afendi Mohamed KUALA LUMPUR: FORMER Selangor Pas commissioner Datuk Dr Hasan Ali has not ruled out the possibility of returning to Pas' fold"; $search ="KUALA"; $pattern='/\b$search\b/'; if (preg_match($pattern, $str, $matches)) echo "FOUND AT POSITION ".$matches[1]; else echo "NOT FOUND"
Используйте функцию PHP stripos ().
$str = "These aren't the droids you are looking for."; $search = "droids"; $pos = stripos($str, $search);
$ pos теперь будет равно 17, позиции, в которой начинается строка. Если вы ищете, чтобы слово имело точно такой же случай, используйте вместо него функцию strpos (); stripos () нечувствителен к регистру. Если функция не находит слово, оно вернет FALSE.
Вы можете использовать это, чтобы определить, содержит ли строка слово.
if(stripos($str, $search)){ echo("It contains the word!"); }else{ echo("Word not found."); }
Если вы хотите проверить, что он существует в строке сам по себе (не является частью другого слова), то вы, вероятно, должны смотреть на регулярные выражения. Что-то вроде:
$str = "These aren't the droids you are looking for. This droid is."; $search = "droid"; if (preg_match("/\b$search\b/", $str, $match)) { $result = $match[0]; }
Это будет соответствовать индексу этого слова, но не тогда, когда оно используется внутри другого слова. Итак, в этом примере:
$result == 51
Хотя поисковый запрос появился ранее в строке.
Или используйте RegExpr:
$str = "The text in the first post"; $search = "first"; if( preg_match('/\b'.$search.'\b/', $str) ) { echo 'FOUND!'; }