Функции поиска подстроки в PHP: от strpos до многобайтовых решений

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

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

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

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

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

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

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

В этом примере ищется слово 'world' в строке 'Hello world'. Функция возвращает 6, так как отсчет начинается с нуля (H=0, e=1, l=2, l=3, o=4, пробел=5, w=6).

Типичная ошибка: использование == вместо ===. Если подстрока находится в начале строки, strpos возвращает 0, что при нестрогом сравнении интерпретируется как false. Всегда проверяйте результат с помощью !== false.

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

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

$text = 'PHP is great';
$pos = stripos($text, 'php');
echo $pos; // 0

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

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

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

$text = 'apple, banana, apple';
$pos = strrpos($text, 'apple');
echo $pos; // 14 (второе 'apple' начинается с позиции 14)

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

Для корректного поиска в строках с кириллицей, иероглифами и другими многобайтовыми символами используйте семейство mb_strpos, mb_stripos, mb_strrpos. Они учитывают кодировку. Необходимо указать кодировку третьим параметром или через mb_internal_encoding.

$text = 'Привет, мир!';
$pos = mb_strpos($text, 'мир', 0, 'UTF-8');
echo $pos; // 8 (буква 'м' находится на 8-й позиции)

Если не указать кодировку, mb_strpos использует внутреннюю кодировку, что может привести к неверным результатам. Всегда передавайте явно кодировку.

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

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

$text = 'Hello world';
if (str_contains($text, 'world')) {
    echo 'Содержит';
} else {
    echo 'Не содержит';
}

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

Если требуется сложный шаблон, используется preg_match. Например, поиск цифры в строке:

$text = 'Страница 404';
if (preg_match('/\d+/', $text, $matches)) {
    echo 'Найдено число: ' . $matches[0];
} else {
    echo 'Число не найдено';
}

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

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

Ниже приведены несколько практических сценариев с подробными пояснениями.

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

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

Пример
$text = 'ababa';
$needle = 'aba';
$offset = 0;
$positions = [];
while (($pos = strpos($text, $needle, $offset)) !== false) {
    $positions[] = $pos;
    $offset = $pos + 1; // смещаемся на 1, чтобы избежать повторного нахождения той же позиции
}
print_r($positions);
Array
(
    [0] => 0
    [1] => 2
)

Внимание: смещение $pos + 1 может пропустить перекрывающиеся вхождения. Если нужны все, включая перекрывающиеся, смещение должно быть $pos + 1; для неперекрывающихся - $pos + strlen($needle).

2. Поиск с учетом кодировки при работе с кириллицей

Пример корректного поиска в UTF-8 строке с помощью mb_strpos.

Пример
$text = 'Привет, как дела?';
$needle = 'как';
$pos = mb_strpos($text, $needle, 0, 'UTF-8');
echo 'Позиция: ' . $pos; // 8
// Проверка: П(0) р(1) и(2) в(3) е(4) т(5) ,(6) (7) к(8) а(9) к(10)...
Позиция: 8

3. Использование strrpos для извлечения расширения файла

Функция strrpos помогает найти последнюю точку в имени файла и извлечь расширение.

Пример
$filename = 'image.2023.jpg';
$dotPos = strrpos($filename, '.');
if ($dotPos !== false) {
    $extension = substr($filename, $dotPos + 1);
    echo $extension; // jpg
}
jpg

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

Для многобайтовых строк без учета регистра используйте mb_stripos.

Пример
$text = 'Функция Search';
$needle = 'search';
$pos = mb_stripos($text, $needle, 0, 'UTF-8');
echo $pos; // 9 (буква S в 'Search' находится на позиции 9)
9

5. Проверка наличия подстроки с помощью str_contains (PHP 8+)

Пример
$text = 'PHP 8.0 introduced str_contains';
if (str_contains($text, '8.0')) {
    echo 'Версия 8.0 упоминается';
} else {
    echo 'Не упоминается';
}
Версия 8.0 упоминается

6. Поиск с отрицательным смещением (поддержка с PHP 7.1)

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

Пример
$text = 'abcdefabcdef';
$pos = strpos($text, 'a', -5); // поиск начиная с 5-го символа с конца
echo $pos; // 6 (второе 'a')
// Отрицательный offset: -5 означает пропустить последние 5 символов => строка 'abcdefa', ищем 'a' в ней
6

Поиск символа в строке PHP (strpos) - comments

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