Как проверить, содержит ли строка определенное слово в PHP?
Рассмотрим следующий код:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
Как правильно написать оператор if ($a contains 'are') в PHP?
В PHP нет ключевого слова или оператора contains, как в некоторых других языках. Чтобы проверить, содержит ли строка определенную подстроку, необходимо использовать встроенные строковые функции. Вот наиболее распространенные методы:
Содержание
- Использование функции strpos()
- Использование функции strstr()
- Использование функции str_contains() (PHP 8.0+)
- Использование preg_match() для сопоставления с образцом
- Полный рабочий пример
- Лучшие практики
Использование функции strpos()
Наиболее традиционный подход - использование функции strpos(), которая находит позицию первого вхождения подстроки:
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
}
Ключевые моменты:
strpos()возвращает позицию (индекс), где найдена подстрока- Если подстрока не найдена, функция возвращает
false - Всегда используйте
!== false(не равно И не тождественно) для правильной проверки на false !==важно, потому чтоstrpos()может вернуть0(означает найдено в позиции 0), и0 == falseбыло бы истинно в PHP
Использование функции strstr()
strstr() возвращает часть строки от первого вхождения подстроки до конца:
$a = 'How are you?';
if (strstr($a, 'are')) {
echo 'true';
}
Ключевые моменты:
strstr()возвращает подстроку, если найдена, илиfalse, если не найдена- Также можно использовать
stristr()для поиска без учета регистра - Удобнее, когда вам фактически нужна подстрока с точки совпадения
Использование функции str_contains() (PHP 8.0+)
В PHP 8.0 была введена функция str_contains(), которая является наиболее прямым подходом:
$a = 'How are you?';
if (str_contains($a, 'are')) {
echo 'true';
}
Ключевые моменты:
- Возвращает
true, если подстрока найдена, иfalseв противном случае - Much more readable and intuitive than
strpos() - Доступна только в PHP 8.0 и более поздних версиях
- По умолчанию чувствительна к регистру
Использование preg_match() для сопоставления с образцом
Для более сложного сопоставления с образцом или регулярных выражений:
$a = 'How are you?';
if (preg_match('/are/', $a)) {
echo 'true';
}
Ключевые моменты:
- Использует PCRE (Perl Compatible Regular Expressions)
- Мощно для сложных шаблонов сопоставления
- Возвращает
1, если шаблон найден,0, если не найден, илиfalseв случае ошибки - Полезно для границ слов, поиска без учета регистра и т.д.
Полный рабочий пример
Вот полный пример, демонстрирующий все методы:
$text = 'How are you today?';
$search = 'are';
// Метод 1: strpos()
if (strpos($text, $search) !== false) {
echo "Найдено с использованием strpos()\n";
}
// Метод 2: strstr()
if (strstr($text, $search)) {
echo "Найдено с использованием strstr()\n";
}
// Метод 3: str_contains() (PHP 8.0+)
if (function_exists('str_contains') && str_contains($text, $search)) {
echo "Найдено с использованием str_contains()\n";
}
// Метод 4: preg_match()
if (preg_match('/' . preg_quote($search, '/') . '/', $text)) {
echo "Найдено с использованием preg_match()\n";
}
Лучшие практики
Какой метод выбрать?
- PHP 8.0+: Используйте
str_contains()для наиболее читаемого и прямого подхода - Legacy PHP: Используйте
strpos() !== falseдля совместимости со старыми версиями - Когда вам нужна найденная подстрока: Используйте
strstr() - Сложные шаблоны: Используйте
preg_match()
Поиск без учета регистра
Для поиска без учета регистра:
// Использование stristr()
if (stristr($text, 'ARE')) {
echo 'Найдено (без учета регистра)';
}
// Использование preg_match() с флагом без учета регистра
if (preg_match('/are/i', $text)) {
echo 'Найдено (без учета регистра)';
}
// Использование str_contains() со strtolower (PHP 8.0+)
if (str_contains(strtolower($text), strtolower('ARE'))) {
echo 'Найдено (без учета регистра)';
}
Проверка целых слов
Чтобы проверить наличие целых слов (а не подстрок внутри слов):
// Использование preg_match() с границами слов
if (preg_match('/\bare\b/', $text)) {
echo 'Найдено целое слово "are"';
}
Проверка нескольких подстрок
Чтобы проверить, содержит ли строка любую из нескольких подстрок:
$words = ['are', 'you', 'hello'];
foreach ($words as $word) {
if (str_contains($text, $word)) {
echo "Найдено: $word\n";
}
}
Правильный способ написать ваш исходный код:
$a = 'How are you?';
if (str_contains($a, 'are')) {
echo 'true';
}
Или для старых версий PHP:
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
}
Источники
- Документация PHP str_contains()
- Документация PHP strpos()
- Документация PHP strstr()
- Документация PHP preg_match()
Заключение
Чтобы проверить, содержит ли строка определенное слово в PHP, у вас есть несколько вариантов в зависимости от версии PHP и требований:
- PHP 8.0+: Используйте
str_contains($string, $substring)для наиболее читаемого решения - Все версии PHP: Используйте
strpos($string, $substring) !== falseдля максимальной совместимости - Когда вам нужен найденный текст: Используйте
strstr()илиstristr() - Для сложных шаблонов: Используйте
preg_match()с регулярными выражениями
Выберите метод, который лучше всего соответствует версии PHP вашего проекта и конкретным требованиям. Для современной разработки на PHP str_contains() является предпочтительным выбором благодаря своей простоте и читаемости.