Я не знаю о абсолютном самом быстром способе, но это, вероятно, самый быстрый способ сделать это с помощью регулярного выражения:
'#(?:\b(?>great\b()|leather\b()|shoes\b()|\w++\b)\W*+)++\1\2\3#i'
Это соответствует каждому слову в строке, и если это слово является одним из ваших ключевых слов, пустая группа захвата "проверяет его". Как только все слова в строке сопоставлены, обратные ссылки (\1\2\3
) гарантируют, что каждое из трех ключевых слов было просмотрено хотя бы один раз.
Подход, основанный на прогнозировании, который обычно рекомендуется для такого рода задач, должен сканировать потенциально всю строку несколько раз - по одному разу для каждого ключевого слова. Это регулярное выражение должно сканировать строку только один раз - фактически, обратное отслеживание отключено притяжательными квантификаторами (++
, *+
) и атомными группами ((?>...)
).
Тем не менее, я все равно пойду с осторожным подходом, если не буду знать, что это вызывает узкое место. В большинстве случаев его большая читаемость стоит компромисса в производительности.