Функции поиска в строке на PHP

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

Основные методы поиска в строке

Наиболее эффективное решение

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

$str = 'Привет, мир!';
$pos = strpos($str, 'мир');
if ($pos !== false) {
echo 'Найдено на позиции: ' . $pos;
} else {
echo 'Не найдено';
}
Найдено на позиции: 8

Типичная ошибка:

Использование if (strpos($str, 'подстрока')) - если подстрока находится в начале строки (позиция 0), условие ложно, хотя вхождение есть. Решение: всегда применять !== false.

Как найти первое вхождение без учета регистра?

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

$str = 'PHP это язык PHP';
$pos = stripos($str, 'php');
if ($pos !== false) {
echo 'Первое вхождение без учета регистра на позиции: ' . $pos;
}
Первое вхождение без учета регистра на позиции: 0

Проблема:

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

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

Функции strrpos и strripos находят последнее вхождение подстроки. strrpos - регистрозависимый, strripos - без учета регистра.

$str = 'PHP и JavaScript. PHP - серверный язык.';
$lastPos = strrpos($str, 'PHP');
if ($lastPos !== false) {
echo 'Последнее вхождение на позиции: ' . $lastPos;
}
Последнее вхождение на позиции: 18

Ошибка:

Если подстрока не найдена, возвращается false, что при нестрогом сравнении может быть спутано с нулём. Обязательно используйте !== false.

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

Функция substr_count возвращает число непересекающихся вхождений подстроки. Она не возвращает позиции, только количество.

$str = 'ababab';
$count = substr_count($str, 'ab');
echo 'Количество вхождений: ' . $count;
Количество вхождений: 3

Особенность:

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

Как работать с многобайтовыми кодировками (UTF-8)?

Стандартные strpos и аналоги работают с байтами, а не с символами. Для корректного поиска в UTF-8 используются функции с префиксом mb_:

  • mb_strpos - регистрозависимый
  • mb_stripos - без учёта регистра
  • mb_strrpos - последнее вхождение
  • mb_substr_count - количество вхождений
$str = 'Привет, мир! Мир прекрасен.';
$pos = mb_strpos($str, 'мир', 0, 'UTF-8');
if ($pos !== false) {
echo 'Позиция в UTF-8: ' . $pos;
}
Позиция в UTF-8: 8

Проблема:

Если расширение mbstring не установлено, mb_* функции не доступны. Альтернатива - перекодировать строку в однобайтовую (например, с помощью utf8_decode) или установить расширение.

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

Функция preg_match позволяет искать по шаблону. Это гибкое решение для сложных критериев (например, поиск по маске, цифры, слова). Возвращает 1, если найдено, 0 - если нет, или false при ошибке.

$str = 'Телефон: +7 (123) 456-78-90';
$pattern = '/\+\d[\s\(\d\)\-]+/';
if (preg_match($pattern, $str, $matches)) {
echo 'Найден номер: ' . $matches[0];
} else {
echo 'Номер не найден';
}
Найден номер: +7 (123) 456-78-90

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

1. Неправильное экранирование символов (например, забыли экранировать обратную косую черту). 2. Использование preg_match для простого поиска фиксированной подстроки - избыточно и медленнее, чем strpos. 3. Игнорирование флага PREG_OFFSET_CAPTURE если нужна позиция.

Практические примеры поиска подстрок

1. strpos с проверкой наличия и позиции

Пример
$text = 'PHP - распространённый язык программирования.';
$search = 'PHP';
$pos = strpos($text, $search);
if ($pos !== false) {
echo "Подстрока '$search' найдена на позиции $pos.";
} else {
echo "Подстрока '$search' не найдена.";
}
Подстрока 'PHP' найдена на позиции 0.

2. stripos: регистронезависимый поиск

Пример
$sentence = 'Я люблю PHP и Php';
$search = 'php';
$pos = stripos($sentence, $search);
if ($pos !== false) {
echo "Первое вхождение (без учёта регистра) на позиции $pos.";
}
Первое вхождение (без учёта регистра) на позиции 8.

3. strrpos: последнее вхождение

Пример
$data = 'apple, banana, apple, cherry';
$needle = 'apple';
$last = strrpos($data, $needle);
if ($last !== false) {
echo "Последнее вхождение '$needle' на позиции $last.";
}
Последнее вхождение 'apple' на позиции 15.

4. substr_count: подсчёт вхождений

Пример
$string = 'раз два раз три раз';
$sub = 'раз';
$cnt = substr_count($string, $sub);
echo "Количество вхождений '$sub': $cnt.";
Количество вхождений 'раз': 3.

5. mb_strpos в UTF-8 строке

Пример
$utfStr = 'Привет, Код! Кодировка UTF-8.';
$needle = 'Код';
$pos = mb_strpos($utfStr, $needle, 0, 'UTF-8');
if ($pos !== false) {
echo "Позиция '$needle' (в символах): $pos.";
}
Позиция 'Код' (в символах): 8.

6. preg_match с захватом группы

Пример
$url = 'https://example.com/page?id=42';
$pattern = '/\?id=(\d+)/';
if (preg_match($pattern, $url, $match)) {
echo "ID: {$match[1]}";
} else {
echo "ID не найден.";
}
ID: 42

7. preg_match_all для нахождения всех вхождений

Пример
$text = 'Цена: 100 руб, 200 руб, 300 руб';
$pattern = '/(\d+)/';
preg_match_all($pattern, $text, $matches);
print_r($matches[0]);
Array
(
[0] => 100
[1] => 200
[2] => 300
)

Поиск в строке PHP - comments

En
Str search php (php)