предварительно сопоставьте все слова в строке
Ищу возможность определить, соответствует ли $string
всем словам в $array
.
Порядок слов заранее неизвестен (набранный пользователем текст).
array(
'test',
'shmest',
'zest',
'fest',
'etcest'
);
Я понимаю, что могу:
$is_match = true;
foreach ($array as $word) {
if (!strpos($string, $word) === false) {
$is_match = false;
break;
}
}
(Могу|должен) я сделать что-то подобное выше с помощью preg_match[_all]?
ПРАВКА1
Приоритет - меньше памяти и быстрая работа.
Протестировано 2 отказа и собственный выше https://eval.in/144266 так что мой самый быстрый
И $string
могут содержать любые символы
2 answers
Вы можете создать регулярное выражение с помощью LookAheads:
$regex='/(?=.*?'.implode(')(?=.*?', $needles).')/s';
Затем просто проверьте свою строку:
if (preg_match($regex,$string)===1) echo 'true';
Демонстрационный код: https://eval.in/144296
Объясненное регулярное выражение: http://regex101.com/r/eQ0hU4
Использовать preg_split()
и array_intersect()
:
$words = preg_split("/(?<=\w)\b\s*/", $input, -1, PREG_SPLIT_NO_EMPTY);
echo (array_intersect($arr, $words) == $arr) ? 'True' : 'False';
В основном preg_split()
разбивает вашу входную строку на массив слов. array_intersect()
проверяет, присутствуют ли все элементы в $arr
в $words
.
Демо-версия