используя strpos, я могу найти одно слово в строке, но как мне найти много слов?
Я знаю, как это сделать, когда строка содержит слова, разделенные пробелом, но, например, если у меня есть array('hi','how','are','you')
и строка $string = 'hihowareyoudoingtoday?'
Как я могу вернуть общую сумму, найденную для соответствия?
Ты можешь использовать preg_match_all
который возвращает количество совпадений:
$words = array('hi','how','are','you');
$nb = preg_match_all('~' . implode('|', $words) . '~', $string, $m);
print_r($m[0]);
echo "\n$nb";
preg_match_all
это функция, которая ищет все вхождения шаблона в строке. В настоящем примере шаблон:
~hi|how|are|you~
~
это только разделитель шаблона.
|
это логическое ИЛИ
Обратите внимание, что поиск выполняется слева направо символ за символом в строке, и каждая альтернатива проверяется до совпадения. Таким образом, первое слово, которое соответствует в позиции, сохраняется как результат соответствия (в $m
).
Понимание этого механизма важно. Например, если у вас есть строка baobab
и шаблон ~bao|baobab~
, результат будет только bao
так как это первая проверенная альтернатива.
Другими словами, если вы хотите сначала получить самые большие слова, вам нужно сначала отсортировать массив по размеру.
Да, вы можете использовать strpos()
в этом случае:
Пример:
$haystack = 'hihowareyoudoingtoday?';
$needles = array('hi','how','are','you');
$matches = 0;
foreach($needles as $needle) { // create a loop, foreach string
if(strpos($haystack, $needle) !== false) { // use stripos and compare it in the parent string
$matches++; // if it matches then increment.
}
}
echo $matches; // 4