Как проверить, содержит ли строка определенное слово в PHP?
Использование 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 — это надёжный классический метод.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги