7 эффективных способов проверить, содержит ли строка PHP слова из списка

В PHP существует несколько методов определения того, содержит ли строка какие-либо слова из заданного списка. В этой статье будут рассмотрены семь эффективных методов использования разговорного языка и приведены примеры кода для каждого подхода. В итоге у вас будет целый ряд вариантов на выбор, исходя из ваших конкретных потребностей.

Метод 1: использование strpos
Функция strpos позволяет найти позицию первого вхождения подстроки в строку. Перебирая список слов и проверяя, существуют ли какие-либо из них в строке, вы можете определить, содержит ли строка какие-либо слова.

$string = "This is a sample string";
$words = ["sample", "test", "example"];
foreach ($words as $word) {
    if (strpos($string, $word) !== false) {
        echo "String contains the word: " . $word;
        break;
    }
}

Метод 2: использование str_contains (PHP 8+)
Если вы используете PHP 8 или более позднюю версию, вы можете воспользоваться функцией str_contains, которая напрямую проверяет, содержит ли строка определенную подстроку. Этот метод упрощает процесс и обеспечивает более читаемый код.

$string = "This is a sample string";
$words = ["sample", "test", "example"];
foreach ($words as $word) {
    if (str_contains($string, $word)) {
        echo "String contains the word: " . $word;
        break;
    }
}

Метод 3: регулярные выражения с preg_match
Регулярные выражения предоставляют мощные возможности сопоставления с образцом. Вы можете использовать preg_match для поиска любого слова из списка внутри строки с использованием шаблона регулярного выражения.

$string = "This is a sample string";
$words = ["sample", "test", "example"];
$pattern = '/\b(' . implode('|', $words) . ')\b/';
if (preg_match($pattern, $string)) {
    echo "String contains one of the words";
}

Метод 4: использование array_intersect
Функция array_intersect позволяет находить общие значения между двумя массивами. Преобразовав строку в массив слов и используя array_intersect, вы можете проверить, существует ли какое-либо слово из строки в списке.

$string = "This is a sample string";
$words = ["sample", "test", "example"];
$wordsInString = explode(" ", $string);
$commonWords = array_intersect($wordsInString, $words);
if (!empty($commonWords)) {
    echo "String contains one of the words";
}

Метод 5: использование in_array
Функция in_array проверяет, существует ли значение в массиве. Разделив строку на слова и пройдя по ним, вы можете определить, присутствует ли какое-либо слово из строки в списке.

$string = "This is a sample string";
$words = ["sample", "test", "example"];
$wordsInString = explode(" ", $string);
foreach ($wordsInString as $word) {
    if (in_array($word, $words)) {
        echo "String contains the word: " . $word;
        break;
    }
}

Метод 6: использование str_word_count
Функция str_word_count подсчитывает количество слов в строке. Сравнивая количество с исходной строкой, вы можете определить, существуют ли в строке какие-либо слова из списка.

$string = "This is a sample string";
$words = ["sample", "test", "example"];
$wordCount = str_word_count($string, 1);
if (count(array_intersect($wordCount, $words)) > 0) {
    echo "String contains one of the words";
}

Метод 7: оптимизация производительности
Если у вас большая строка или обширный список слов, важно оптимизировать производительность вашего кода. Один из способов добиться этого — использовать алгоритм поиска строк Бойера-Мура, который повышает эффективность поиска подстрок. Реализация этого алгоритма выходит за рамки этой статьи, но его стоит рассмотреть в сценариях, где производительность критична.

В этой статье мы рассмотрели семь методов проверки того, содержит ли строка PHP слова из предоставленного списка. От использования встроенных функций, таких как strpos и str_contains, до использования регулярных выражений и операций с массивами — теперь у вас есть множество методов на выбор. При выборе наиболее подходящего метода не забудьте учитывать размер строки и списка, а также требования к производительности вашего приложения.