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

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

Поиск в строках PHP: основные функции и примеры

Наиболее эффективным решением для поиска подстроки в PHP является функция strpos(). Она возвращает позицию первого вхождения подстроки (начиная с 0) или false, если подстрока не найдена. Эта функция работает быстро и учитывает регистр символов.


$string = 'Привет, мир!';
$substring = 'мир';
$position = strpos($string, $substring);
var_dump($position); // int(8)

Проблема: функция может вернуть 0, если подстрока найдена в самом начале строки. В PHP 0 преобразуется в false при обычной проверке, поэтому для корректного сравнения используется оператор === или !==.

Типичная ошибка: if (strpos($str, 'abc')) не сработает, если подстрока находится в начале строки (позиция 0). Верное условие: if (strpos($str, 'abc') !== false).

Цель: проверить наличие подстроки, получить её позицию. Случаи использования: поиск ключевых слов, разбор текста, валидация ввода.

Как найти подстроку, игнорируя регистр символов?

Функция stripos() работает аналогично strpos(), но не учитывает регистр. Это удобно для поиска без учёта того, как написаны символы.


$string = 'PHP - язык программирования';
$search = 'язык';
$pos = stripos($string, $search); // вернет 6

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

Случаи использования: поиск хэштегов, фильтрация комментариев, сравнение названий.

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

Функции strrpos() (с учётом регистра) и strripos() (без учёта регистра) находят последнее вхождение подстроки.


$url = 'http://example.com/page?param=123';
$lastSlash = strrpos($url, '/');
echo substr($url, $lastSlash + 1); // page?param=123

Случаи использования: извлечение имени файла из пути, получение последнего параметра в URL.

Как правильно искать подстроку в UTF-8 строке?

Для корректной работы с многобайтовыми кодировками (UTF-8, UTF-16 и т.д.) используйте функции модуля mbstring: mb_strpos(), mb_stripos(), mb_strrpos(). Они оперируют символами, а не байтами.


$text = 'Привет, мир!';
$pos = mb_strpos($text, 'мир', 0, 'UTF-8'); // 8

Распространённая ошибка: использование strpos с UTF-8 может привести к неправильной позиции, так как кириллические символы занимают 2 байта. Проверьте, что модуль mbstring включён в PHP (phpinfo).

Случаи использования: работа с многоязычными текстами, разбор Unicode-строк.

Как искать по шаблону с помощью регулярных выражений?

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


$email = 'user@example.com';
$pattern = '/@([a-z0-9.-]+)\.([a-z]{2,})/i';
if (preg_match($pattern, $email, $matches)) {
    echo 'Домен: ' . $matches[1] . '.' . $matches[2];
}

Проблемы: сложность для новичков, возможные ошибки с разделителями (например, забыли поставить /), производительность при многократном вызове в цикле. Для простого поиска лучше использовать strpos.

Случаи использования: валидация форматов (email, телефон), извлечение данных из текста, замена по шаблону.

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

strstr() (с учётом регистра) и stristr() (без учёта) возвращают подстроку от первого вхождения и до конца. Для получения части до подстроки используется флаг true (до PHP 5.3 - третий параметр).


$str = 'Имя: Иван Возраст: 25';
$afterName = strstr($str, 'Возраст'); // 'Возраст: 25'
$beforeAge = strstr($str, 'Возраст', true); // 'Имя: Иван '

Случаи использования: парсинг простых форматов, обрезка строк.

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

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


$sentence = 'PHP это PHP, но не только PHP';
echo substr_count($sentence, 'PHP'); // 3

Ошибка: функция считает только непересекающиеся вхождения. Например, в строке 'aaa' при поиске 'aa' результат будет 1, а не 2. Для пересекающихся вхождений нужно использовать регулярные выражения.

Случаи использования: подсчёт слов, анализ частоты упоминаний.

Углублённые примеры и редкие приёмы поиска в PHP

Поиск всех вхождений подстроки с помощью strpos в цикле

Для нахождения всех позиций вхождения без регулярных выражений используется смещение (offset) в strpos(). Каждый раз смещение увеличивается на 1 после найденной позиции.

Пример

$text = 'Программирование на PHP это интересно. PHP универсален.';
$search = 'PHP';
$offset = 0;
$positions = [];
while (($pos = strpos($text, $search, $offset)) !== false) {
    $positions[] = $pos;
    $offset = $pos + 1;
}
print_r($positions);
Array
(
    [0] => 20
    [1] => 45
)

Пояснение: цикл продолжается, пока strpos не вернёт false. Смещение обновляется, чтобы не зациклиться на одном вхождении.

Извлечение всех email адресов с помощью preg_match_all

Использование именованных групп для удобного извлечения.

Пример

$text = 'Контакты: support@example.com, info@mail.ru';
$pattern = '/(?P<name>[a-z0-9._%+-]+)@(?P<domain>[a-z0-9.-]+\.[a-z]{2,})/i';
preg_match_all($pattern, $text, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
    echo $match['name'] . ' @ ' . $match['domain'] . "\n";
}
support @ example.com
info @ mail.ru

Поиск с учётом регистра в UTF-8 через mb_ereg

Модуль mbstring предоставляет функции mb_ereg() и mb_eregi() для регулярных выражений с поддержкой многобайтовых кодировок.

Пример

$str = 'Привет, МИР!';
$pattern = 'мир';
if (mb_eregi($pattern, $str)) {
    echo 'Найдено без учёта регистра';
}
$pos = mb_strpos($str, 'мир', 0, 'UTF-8'); // false, так как 'мир' и 'МИР' - разный регистр
$posCI = mb_stripos($str, 'мир', 0, 'UTF-8'); // 9
Найдено без учёта регистра

Пояснение: mb_eregi игнорирует регистр и работает с Unicode, но требует установленного модуля mbstring и корректной кодировки.

Поиск подстроки с игнорированием HTML-тегов

Сначала удаляем теги функцией strip_tags(), затем выполняем поиск.

Пример

$html = '<p>Важное <b>сообщение</b> для вас</p>';
$text = strip_tags($html);
if (strpos($text, 'сообщение') !== false) {
    echo 'Ключевое слово найдено в тексте без тегов';
}
Ключевое слово найдено в тексте без тегов

Проблема: strip_tags может удалить не все нежелательные символы (например, сущности). Для точного поиска в HTML лучше использовать DOMDocument или регулярные выражения с учётом структуры.

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

Регулярные выражения позволяют искать одну из нескольких подстрок. Пример: найти позицию первого вхождения любого из слов 'ошибка', 'предупреждение', 'критично'.

Пример

$log = 'Произошла ошибка в модуле';
$pattern = '/ошибка|предупреждение|критично/i';
if (preg_match($pattern, $log, $match, PREG_OFFSET_CAPTURE)) {
    echo 'Найдено: ' . $match[0][0] . ' на позиции ' . $match[0][1];
}
Найдено: ошибка на позиции 10

Использование флага PREG_OFFSET_CAPTURE даёт не только текст совпадения, но и его позицию (в байтах).

Поиск пересекающихся вхождений с помощью регулярного выражения с просмотром вперёд

Для подсчёта пересекающихся подстрок (например, 'aa' в 'aaa' 2 раза) используется опережающая проверка.

Пример

$str = 'aaa';
preg_match_all('/(?=aa)/', $str, $matches);
echo count($matches[0]); // 2
2

Пояснение: шаблон (?=aa) находит позиции перед каждым 'aa', не захватывая символы.

Поиск последнего вхождения с помощью strrpos и многобайтовой версии

Для UTF-8 строк используйте mb_strrpos(). Пример - получение имени файла из пути в Windows (символ '\') и в Unix ('/').

Пример

$path = '/var/www/html/index.php';
$lastSlash = mb_strrpos($path, '/', 'UTF-8');
echo substr($path, $lastSlash + 1); // index.php
index.php
символы PHPПроверить строку в PHPУдаление пробелов в PHPПолучение подстроки в PHPдлина строки PHPЗамена в строке PHPПоиск в строке PHPПолучение первых символов строки в PHPпроверка наличия подстроки в PHPСлова в PHP (работа со строками)Поиск в PHPРабота с символами в PHPРабота с текстом в PHPКодирование строк в PHP (encode)Регулярные выражения в PHP (preg)Работа с символами строки в PHPФорматирование строк в PHPЗамена строк в PHP

Поиск в PHP - comments

En
Php find (php)