Инструменты поиска фрагмента строки в PHP: от strpos до регулярных выражений

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

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

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

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

Результат: Подстрока найдена на позиции 7

Типичная ошибка: использование оператора != или == вместо строгого сравнения !==. Если подстрока находится в начале строки (позиция 0), strpos вернёт 0, который в условном операторе if ($position == false) будет интерпретироваться как false. Рекомендуется всегда использовать !== для проверки.

Как проверить наличие подстроки без необходимости сравнивать с false?

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

$str = "Hello, world!";
if (str_contains($str, "world")) {
    echo "Подстрока найдена";
} else {
    echo "Подстрока не найдена";
}

Результат: Подстрока найдена

Функция не возвращает позицию вхождения. Для получения позиции можно использовать strpos или mb_strpos.

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

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

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

Результат: Подстрока найдена на позиции 7

Аналогичная проблема с проверкой на false. Также не подходит для многобайтовых кодировок; рекомендуется использовать mb_stripos.

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

Функция strrpos возвращает позицию последнего вхождения подстроки. Полезна, когда нужно найти последний элемент, например, расширение файла.

$path = "catalog/file.txt";
$dot = strrpos($path, ".");
$extension = substr($path, $dot + 1);
echo $extension; // txt

Результат: txt

Если подстрока не найдена, возвращает false. Необходимо строгое сравнение.

Как найти подстроку, соответствующую сложному шаблону?

Для поиска по регулярному выражению используйте preg_match. Это мощный инструмент для поиска с использованием метасимволов.

$str = "Цена: 1500 руб.";
if (preg_match("/\\d+/", $str, $matches)) {
    echo "Найдено число: " . $matches[0];
}

Результат: Найдено число: 1500

Регулярные выражения медленнее обычных функций. Требуется экранирование специальных символов. Для простых строк лучше использовать strpos.

Как корректно искать подстроку в строке с кириллицей или другими многобайтовыми кодировками?

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

$str = "Привет, мир!";
$pos = mb_strpos($str, "мир", 0, "UTF-8");
echo $pos; // 8 (считая с 0)

Результат: 8

Без указания кодировки mb_strpos может вести себя непредсказуемо. Следует передавать параметр encoding.

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

Функция strstr возвращает часть строки от первого вхождения подстроки до конца (по умолчанию). Если подстрока не найдена, возвращает false.

$str = "username@example.com";
$domain = strstr($str, "@");
echo $domain; // @example.com

Результат: @example.com

Если нужно получить часть до подстроки, можно использовать strstr с третьим параметром true (доступно с PHP 5.3).

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

В этом разделе собраны дополнительные примеры, которые помогут глубже понять возможности поиска подстроки в PHP.

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

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

Пример
$text = "ababa";
$count = substr_count($text, "aba");
echo $count;
1

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

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

Пример
$str = "PHP is great. PHP is powerful.";
$sub = "PHP";
$offset = 0;
$positions = [];
while (($pos = strpos($str, $sub, $offset)) !== false) {
    $positions[] = $pos;
    $offset = $pos + 1;
}
print_r($positions);
Array ( [0] => 0 [1] => 16 )

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

Функция preg_match_all находит все совпадения с шаблоном.

Пример
$str = "Цена 100 руб, скидка 20%";
preg_match_all("/\\d+/", $str, $matches);
print_r($matches[0]);
Array ( [0] => 100 [1] => 20 )

Извлечение строки между двумя подстроками

Комбинация strpos и substr позволяет получить текст, расположенный между двумя маркерами.

Пример
$html = "<h1>Заголовок</h1>";
$start = strpos($html, ">") + 1;
$end = strpos($html, "</", $start);
$inner = substr($html, $start, $end - $start);
echo $inner;
Заголовок

Поиск в многобайтовой строке: сравнение strpos и mb_strpos

Для строки с кириллицей strpos вернёт позицию в байтах, что может сбить с толку.

Пример
$str = "Привет, мир!";
echo "strpos: " . strpos($str, "мир") . "\n";
echo "mb_strpos: " . mb_strpos($str, "мир", 0, "UTF-8");
strpos: 14
mb_strpos: 8

В UTF-8 каждый символ может занимать 2 байта, поэтому strpos показывает 14 (в байтах), а mb_strpos - 8 (в символах).

Поиск любого символа из заданного набора с помощью strpbrk

Функция strpbrk ищет первое вхождение любого символа из указанного набора и возвращает строку от этого символа до конца.

Пример
$str = "hello@world.com";
$result = strpbrk($str, "@.");
echo $result;
@world.com

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

Третий параметр before_needle (true) заставляет strstr вернуть часть до первого вхождения.

Пример
$email = "user@example.com";
$name = strstr($email, "@", true);
echo $name;
user

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

En
подстрока строки php (php)