Просто альтернатива, использующая str_word_count()
, которую вы не видите много, используя 2 в качестве второго параметра, чтобы разбить строку на слова в массиве с начальной позицией в качестве ключа.Затем используйте array_intersect()
, чтобы сопоставить это с ключевыми словами ...
$keywords = array("love", "money", "minute", "loop");
// string courtesy of Joni's answer
$html = "love and money make the world loop around in a loop three times per minute";
$words = str_word_count($html, 2);
$match = array_intersect($words, $keywords);
print_r($match);
дает ...
Array
(
[0] => love
[9] => money
[30] => loop
[47] => loop
[68] => minute
)
Не уверен, как это работает с любым регулярным выражением, просто попробуйтеих.
Или, если не считать места на экране ...
print_r(array_intersect(str_word_count($html, 2), $keywords));
Если вы просто хотите, чтобы ключевое слово присутствовало, просто измените порядок массивов в array_intersect()
(и caseнечувствителен - сначала преобразуйте в нижний регистр, используя strtolower()
) ...
$match = array_intersect($keywords, str_word_count(strtolower($html), 1));
, что дает ...
Array
(
[0] => love
[1] => money
[2] => minute
[3] => loop
)
Последнее обновление:
Просмотр производительностиМое решение можно оптимизировать, перевернув массивы так, чтобы вместо сканирования каждого массива на предмет строкового значения проверка наличия ключа была намного быстрее ...
$match = array_flip(array_intersect_key(array_flip($keywords), array_flip(str_word_count(strtolower($html), 1))));