Mb ereg search pos: примеры (PHP)

Поиск позиций регулярных выражений в PHP с mb_ereg_search_pos
Раздел: Многобайтовые строки
mb_ereg_search_pos(string $pattern = null, string $options = null): array|false
Описание функции mb_ereg_search_pos

mb_ereg_search_pos — это функция в PHP для работы с многобайтовыми кодировками, которая выполняет поиск предварительно заданного регулярного выражения в строке и возвращает позицию первого совпадения.

Функция используется, когда требуется найти позицию (начало и длину) первого совпадения с регулярным выражением в строке, используя многобайтовую кодировку, такую как UTF-8. Она применяется после установки строки и шаблона с помощью mb_ereg_search_init.

Аргументы функции

Функция принимает два необязательных аргумента:

  1. pattern (string|null) — регулярное выражение для поиска. Если передан null или аргумент опущен, используется шаблон, заданный ранее в mb_ereg_search_init.
  2. options (string) — строка опций для изменения поведения поиска. Может содержать символы:
    • i — поиск без учета регистра.
    • x — игнорирование пробелов в шаблоне.
    • m — многострочный режим.
    • s — режим, при котором точка соответствует символу новой строки.
    • p — разрешение повторного анализа строки.
    • l — поиск слева направо.

Возвращает массив с ключами 0 (начальная позиция совпадения), 1 (длина совпадения в байтах) и 2 (длина совпадения в символах) или false при отсутствии совпадений.

Короткие примеры использования

Пример с предварительной инициализацией строки и шаблона:

mb_ereg_search_init('Привет, мир!', 'мир');
$result = mb_ereg_search_pos();
print_r($result);
Array
(
    [0] => 8
    [1] => 6
    [2] => 3
)

Пример с передачей шаблона и опций напрямую:

$str = 'Тестовый текст';
mb_ereg_search_init($str);
$result = mb_ereg_search_pos('ТЕКСТ', 'i');
print_r($result);
Array
(
    [0] => 9
    [1] => 10
    [2] => 5
)

Пример с возвратом false при отсутствии совпадения:

mb_ereg_search_init('Строка', 'шаблон');
$result = mb_ereg_search_pos();
var_dump($result);
bool(false)
Похожие функции в PHP

Возвращает массив с текстом совпадения и подмасками. Полезно, когда нужен не только позиция, но и текст совпадения.

mb_ereg_search_getpos / mb_ereg_search_setpos

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

Ищет позицию первого вхождения подстроки, но не поддерживает регулярные выражения. Быстрее для простого поиска подстроки.

preg_match

Функция PCRE для работы с регулярными выражениями, но без встроенной поддержки многобайтовых кодировок (требуется модификатор u для UTF-8). Обычно быстрее для сложных шаблонов.

mb_ereg_search_pos предпочтительнее при работе с многобайтовыми строками и необходимости использовать функции из семейства mb_ereg, которые поддерживают специфичные для кодировки возможности.

Типичные ошибки
Отсутствие инициализации строки

Функция требует предварительного вызова mb_ereg_search_init.

$result = mb_ereg_search_pos('pattern');
var_dump($result);
bool(false)
Некорректная кодировка

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

mb_internal_encoding('ASCII');
mb_ereg_search_init('тест', 'т');
$result = mb_ereg_search_pos();
print_r($result);
Array
(
    [0] => 0
    [1] => 1
    [2] => 1
)

В ASCII символ 'т' не найден корректно, так как строка в UTF-8.

Использование без учета многобайтовости

Передача шаблона с кириллицей без установки правильной кодировки.

mb_internal_encoding('UTF-8');
mb_ereg_search_init('абв', '[а-я]');
$result = mb_ereg_search_pos();
print_r($result);
Array
(
    [0] => 0
    [1] => 2
    [2] => 1
)

Шаблон [а-я] не распознается как диапазон букв в многобайтовом режиме по умолчанию.

Изменения в последних версиях PHP

В PHP 8.0 функция была изменена для более строгой обработки аргументов. Аргумент pattern теперь может быть null. Не передача строки для поиска без предварительной инициализации вызывает ошибку.

В PHP 7.3 были добавлены предупреждения о устаревании для некоторых неиспользуемых параметров в других функциях семейства mb_ereg, но на mb_ereg_search_pos это не повлияло.

В PHP 8.1 и 8.2 изменений в поведении функции не было, но рекомендуется явно указывать кодировку с помощью mb_regex_encoding или mb_internal_encoding.

Расширенные примеры
Поиск с подмасками

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

Пример php
mb_ereg_search_init('Дата: 2023-12-01', '(\d{4})-(\d{2})-(\d{2})');
$pos = mb_ereg_search_pos();
print_r($pos);
Array
(
    [0] => 6
    [1] => 10
    [2] => 10
)
Итеративный поиск всех вхождений

Использование в цикле с mb_ereg_search_setpos.

Пример php
mb_ereg_search_init('a1 b2 c3', '[a-z]\d');
$positions = [];
$offset = 0;
while ($result = mb_ereg_search_pos()) {
    $positions[] = $result;
    mb_ereg_search_setpos($result[0] + $result[2]);
}
print_r($positions);
Array
(
    [0] => Array
        (
            [0] => 0
            [1] => 2
            [2] => 2
        )
    [1] => Array
        (
            [0] => 3
            [1] => 2
            [2] => 2
        )
    [2] => Array
        (
            [0] => 6
            [1] => 2
            [2] => 2
        )
)
Использование опций поиска

Поиск без учета регистра с флагом 'i'.

Пример php
mb_ereg_search_init('Привет', 'ПРИВЕТ', 'i');
$result = mb_ereg_search_pos();
print_r($result);
Array
(
    [0] => 0
    [1] => 12
    [2] => 6
)
Работа с разными кодировками
Пример php
mb_regex_encoding('CP1251');
$str = iconv('UTF-8', 'CP1251', 'пример');
mb_ereg_search_init($str, 'пример');
$result = mb_ereg_search_pos();
print_r($result);
Array
(
    [0] => 0
    [1] => 6
    [2] => 6
)
Обработка ошибок при неверном шаблоне
Пример php
mb_ereg_search_init('текст', '(*');
$result = mb_ereg_search_pos();
var_dump($result);
bool(false)
Альтернативы в других языках

Mb ereg search pos в Python

Модуль re предоставляет функцию re.search(), которая возвращает объект match с методами start(), end() и span() для позиций.

import re
match = re.search(r'мир', 'Привет, мир!')
if match:
    print(match.start(), match.end(), match.span())
8 11 (8, 11)

Mb ereg search pos в Javascript

Метод exec() объекта RegExp возвращает массив с информацией о совпадении, включая индекс index.

let regex = /мир/;
let str = 'Привет, мир!';
let result = regex.exec(str);
console.log(result.index, result[0]);
8 мир

Mb ereg search pos в MySQL

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

SELECT REGEXP_INSTR('Привет, мир!', 'мир');
9

Отличия от PHP: в Python и JavaScript нет встроенной необходимости отдельно указывать многобайтовость для UTF-8. В MySQL позиции считаются с 1, а не с 0.

PHP mb_ereg_search_pos function comments

En
Mb ereg search pos Returns position and length of a matched part of the multibyte regular expression for a predefined multibyte string