предварительно сопоставьте все слова в строке


Ищу возможность определить, соответствует ли $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 могут содержать любые символы

Author: Subdigger, 2014-04-30

2 answers

Вы можете создать регулярное выражение с помощью LookAheads:

$regex='/(?=.*?'.implode(')(?=.*?', $needles).')/s';

Затем просто проверьте свою строку:

if (preg_match($regex,$string)===1) echo 'true';

Демонстрационный код: https://eval.in/144296
Объясненное регулярное выражение: http://regex101.com/r/eQ0hU4

 3
Author: CSᵠ, 2014-04-30 08:44:32

Использовать 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.

Демо-версия

 2
Author: Amal Murali, 2014-04-30 07:03:00