Avatar ·

Как проверить, содержит ли строка определенное слово в PHP?

Всем привет! Я новичок в PHP и пишу небольшой скрипт для обработки комментариев на сайте. Мне нужно проверять, содержит ли строка определённое слово, например, если пользователь написал "спам" или "реклама", то комментарий должен блокироваться. Проблема в том, что я перепробовал несколько способов, но они не работают так, как я ожидаю. Вот что я делал: ```php $text = "Это отличный сайт, спасибо!"; if ($text == "спасибо") { echo "Найдено!"; } ``` Этот код срабатывает только если строка полностью равна слову "спасибо", но если там есть другие слова, то условие не выполняется. Я пробовал также использовать `strpos()`, но он почему-то не всегда находит слово. Например: ```php $text = "Привет, как дела?"; if (strpos($text, "дела")) { echo "Найдено!"; } ``` Иногда это работает, а иногда нет, и я не понимаю почему. К тому же, когда я проверяю слово "спам", а пользователь пишет "СПАМ" большими буквами, то функция его не находит. Подскажите, как правильно проверить, содержит ли строка определённое слово, с учётом регистра и чтобы это работало для любых строк? Буду благодарен за примеры кода! <<>>

Использование strpos() и правильная обработка регистра

Проблема, с которой вы столкнулись, типична для начинающих. Функция strpos() — это правильный инструмент, но её нужно использовать с осторожностью. Главная ошибка — игнорирование того, что strpos() может вернуть 0, если слово находится в самом начале строки. В PHP 0 преобразуется в false в условных операторах, поэтому проверка if (strpos($text, "дела")) не сработает, если слово "дела" стоит в начале строки.

Вот правильный способ:

<?php
$text = "Привет, как дела?";
$word = "дела";

if (strpos($text, $word) !== false) {
    echo "Слово найдено!";
} else {
    echo "Слово не найдено.";
}
?>

Оператор !== (строгое неравенство) гарантирует, что мы проверяем именно на false, а не на любое "ложное" значение. Теперь код будет работать корректно даже если слово в начале строки.

Регистронезависимый поиск

Для поиска без учёта регистра используйте stripos() — аналог strpos(), но игнорирующий регистр:

<?php
$text = "Это СПАМ сообщение";
$word = "спам";

if (stripos($text, $word) !== false) {
    echo "Найдено слово 'спам' (регистр не важен)!";
} else {
    echo "Слово не найдено.";
}
?>

Теперь "СПАМ", "спам", "Спам" — все варианты будут обнаружены.

Проверка на целое слово (а не часть другого слова)

Важная деталь: strpos() ищет подстроку, поэтому слово "спам" будет найдено и в строке "антиспам". Если вам нужно именно целое слово, используйте регулярные выражения с границами слов (\b):

<?php
$text = "Это антиспам фильтр";
$word = "спам";

// Проверка на целое слово
if (preg_match('/\b' . preg_quote($word, '/') . '\b/ui', $text)) {
    echo "Найдено целое слово!";
} else {
    echo "Целое слово не найдено.";
}
?>

Разбор кода:

  • \b — граница слова (начало или конец);
  • preg_quote() — экранирует спецсимволы в слове (например, точки или звёздочки);
  • модификатор u — включает поддержку UTF-8 (для русского языка);
  • модификатор i — отключает учёт регистра.

Пример не сработает для "антиспам", но сработает для "это спам" или "спам!".

Проверка нескольких слов (чёрный список)

Для вашей задачи с блокировкой комментариев удобно использовать массив запрещённых слов:

<?php
$text = "Купите рекламу на сайте!";
$bad_words = ['спам', 'реклама', 'продвижение'];

$found = false;
foreach ($bad_words as $word) {
    if (stripos($text, $word) !== false) {
        $found = true;
        break;
    }
}

if ($found) {
    echo "Комментарий содержит запрещённое слово!";
} else {
    echo "Комментарий одобрен.";
}
?>

Этот код проверяет строку на наличие любого из запрещённых слов (без учёта регистра). Для более точной проверки (только целые слова) используйте регулярное выражение с чередованием:

<?php
$text = "Купите рекламу на сайте!";
$bad_words = ['спам', 'реклама', 'продвижение'];
// Экранируем и объединяем слова через |
$pattern = '/\b(' . implode('|', array_map(function($w) {
    return preg_quote($w, '/');
}, $bad_words)) . ')\b/ui';

if (preg_match($pattern, $text)) {
    echo "Найдено целое запрещённое слово!";
}
?>

Таким образом, вы можете гибко настраивать поиск под свои нужды. Начинайте с stripos() для простых случаев и переходите к регулярным выражениям, когда требуется точное соответствие целым словам.

<<>>

Альтернативный подход: функция str_contains() (PHP 8.0+)

Если вы используете PHP версии 8.0 или новее, то задача упрощается благодаря встроенной функции str_contains(). Она возвращает true или false и не требует проверки на false, как strpos():

<?php
$text = "Привет, как дела?";
if (str_contains($text, "дела")) {
    echo "Слово найдено!";
} else {
    echo "Слово не найдено.";
}
?>

Для регистронезависимого поиска можно комбинировать с mb_strtolower():

<?php
$text = "Это СПАМ";
if (str_contains(mb_strtolower($text), "спам")) {
    echo "Найдено!";
}
?>

Обратите внимание: str_contains() также ищет подстроку, а не целое слово. Если нужна проверка на целое слово, всё равно придётся использовать регулярные выражения. Но для 90% задач str_contains() — самый простой и читаемый вариант.

Проверить версию PHP можно через phpversion() или в phpinfo(). Если у вас PHP 7.x, используйте strpos() с оператором !== false — это надёжный классический метод.