Инструменты поиска фрагмента строки в PHP: от strpos до регулярных выражений
Основные методы поиска подстроки в 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