Содержит ли строка искомую часть? Обзор PHP функций

Раздел: PHP -> Работа со строками в PHP

Основное решение: функция str_contains

Как проверить, содержит ли строка подстроку, наиболее современным и читаемым способом?

Начиная с PHP 8.0, появилась встроенная функция str_contains. Она возвращает true, если подстрока найдена в строке, и false в противном случае. Это самый прямой и эффективный вариант для простых проверок.

$haystack = 'Привет, мир!';
$needle = 'мир';
$result = str_contains($haystack, $needle);
var_dump($result); // bool(true)

Php строка содержит (php строка содержит подстроку)

bool(true)

Php заменить слово (замена слова в строке php)

Возможные проблемы и ошибки:

  • Функция недоступна в PHP версии ниже 8.0. Это может вызвать фатальную ошибку.
  • Подстрока и строка сравниваются с учётом регистра. Для регистронезависимой проверки используйте str_contains с приведением к нижнему регистру или другие функции.
  • Функция не работает корректно с многобайтовыми кодировками, такими как UTF-8. В таких случаях предпочтительнее mb_strpos.

Другие способы проверки наличия подстроки

Как определить позицию подстроки с помощью strpos?

Классический метод, доступный во всех версиях PHP. Функция strpos возвращает числовую позицию первого вхождения подстроки или false, если подстрока не найдена. Для проверки наличия следует использовать строгое сравнение (!== false), поскольку позиция может быть 0 (начало строки).

$str = 'Hello world';
$pos = strpos($str, 'world');
if ($pos !== false) {
    echo "Подстрока найдена на позиции $pos";
} else {
    echo "Подстрока не найдена";
}

Php определить кодировку (определение кодировки строки в php (mb_detect_encoding))

Подстрока найдена на позиции 6

Php размер строки (определение размера строки в php)

Типичные ошибки:

  • Использование == вместо ===. Если подстрока находится в начале строки, strpos вернёт 0, а 0 == false даст true (неверная интерпретация).
  • Забывают проверить false явно, что может привести к неожиданным результатам.

Как выполнить регистронезависимый поиск с stripos?

Функция stripos аналогична strpos, но не учитывает регистр символов. Полезно, когда важно найти подстроку в любом регистре.

$text = 'PHP is great';
$result = stripos($text, 'php');
echo $result !== false ? 'Найдено' : 'Не найдено';

Php первое слово (первое слово в строке php)

Найдено

Ошибки те же, что и у strpos. Не следует полагаться на результат без строгого сравнения.

Как использовать регулярные выражения для поиска подстроки (preg_match)?

preg_match позволяет искать подстроку по шаблону. Это мощный, но более медленный инструмент. Применяется, когда нужны сложные условия: поиск с учётом границ слова, повторений и т.д.

$sentence = 'Кошка ловит мышь';
$found = preg_match('/мышь/i', $sentence); // i - регистронезависимый
echo $found ? 'Совпадение есть' : 'Нет совпадений';
Совпадение есть

При работе с пользовательским вводом необходимо экранировать специальные символы, иначе возможно возникновение ошибок или инъекций. Используйте preg_quote.

Как правильно проверять подстроки в многобайтовых кодировках через mb_strpos?

Если строки содержат символы UTF-8 или другие многобайтовые кодировки, функции strpos и stripos могут дать неверную позицию. mb_strpos учитывает кодировку и возвращает корректную позицию в символах.

$string = 'Привет мир';
$pos = mb_strpos($string, 'мир', 0, 'UTF-8');
var_dump($pos); // int(7)
int(7)

Если не указать кодировку, функция может использовать внутреннюю кодировку, что иногда приводит к неожиданным результатам. Рекомендуется всегда явно задавать encoding.

Как воспользоваться strstr для проверки наличия подстроки?

Функция strstr возвращает часть строки от первого вхождения подстроки до конца, или false, если подстрока не найдена. Это альтернативный способ проверки.

$url = 'https://example.com/page';
$fragment = strstr($url, 'example');
if ($fragment !== false) {
    echo 'Найдено: ' . $fragment;
}
Найдено: example.com/page

Аналогичная проблема с ложным отрицательным результатом при совпадении в начале строки: false может быть спутан с пустой строкой. Нужно строгое сравнение.

Как подсчитать количество вхождений подстроки через substr_count?

Если требуется не просто узнать наличие, а сколько раз подстрока встречается, используется substr_count. Она возвращает целое число.

$phrase = 'раз два три, раз два три';
$count = substr_count($phrase, 'раз');
echo "Слово 'раз' встречается $count раза";
Слово 'раз' встречается 2 раза

Функция не поддерживает перекрывающиеся вхождения (например, при поиске 'аа' в 'ааа' вернёт 1). Для точного подсчёта в таких случаях требуется собственный алгоритм.

Расширенные примеры и нестандартные случаи

Проверка нескольких подстрок одновременно

Иногда нужно узнать, содержит ли строка хотя бы одну из нескольких подстрок. Можно комбинировать str_contains в цикле или использовать регулярное выражение.

Пример
$text = 'Сегодня хорошая погода';
$keywords = ['погода', 'солнце', 'дождь'];
$found = false;
foreach ($keywords as $word) {
    if (str_contains($text, $word)) {
        $found = true;
        break;
    }
}
echo $found ? 'Найдено совпадение' : 'Ничего не найдено';
Найдено совпадение

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

Для UTF-8 строк mb_stripos (аналог stripos с поддержкой кодировки) может отсутствовать в некоторых версиях PHP, поэтому часто используют mb_strpos в паре с mb_strtolower.

Пример
$haystack = 'Тестовая Строка';
$needle = 'строва';
$found = mb_strpos(
    mb_strtolower($haystack, 'UTF-8'),
    mb_strtolower($needle, 'UTF-8'),
    0,
    'UTF-8'
) !== false;
var_dump($found); // bool(true)
bool(true)

Поиск с помощью регулярного выражения с границами слова

Иногда необходимо убедиться, что подстрока является отдельным словом, а не частью другого слова. Для этого используется шаблон с \b.

Пример
$text = 'cat category';
$pattern = '/\bcat\b/i';
if (preg_match($pattern, $text)) {
    echo 'Найдено слово "cat"';
} else {
    echo 'Слово "cat" не найдено как отдельное слово';
}
Найдено слово "cat"

Проверка наличия подстроки в массиве строк

Можно отфильтровать массив строк, оставив только те, которые содержат заданную подстроку. Пример с array_filter и str_contains.

Пример
$fruits = ['яблоко', 'банан', 'апельсин', 'слива'];
$needle = 'ан';
$filtered = array_filter($fruits, function($item) use ($needle) {
    return str_contains($item, $needle);
});
print_r($filtered);
Array
(
    [1] => банан
    [3] => слива
)

Безопасная проверка с учётом типов данных

Если переменная может быть не строкой (например, null, false), вызов str_contains вызовет ошибку. Рекомендуется предварительно приводить к строке или проверять тип.

Пример
$value = null;
// Безопасная проверка
if (is_string($value) && str_contains($value, 'test')) {
    echo 'Содержит test';
} else {
    echo 'Не содержит или не является строкой';
}
Не содержит или не является строкой

Поиск в двоичных данных (нестроковые)

Функции strpos и str_contains работают с двоичными строками (бинарно безопасны), поэтому можно искать последовательность байтов.

Пример
$binaryData = pack('H*', 'aabbccdd');
$needle = pack('H*', 'bbcc');
$found = str_contains($binaryData, $needle);
var_dump($found); // bool(true)
bool(true)

PHP строка содержит подстроку - comments

En
Php строка содержит (php)