Mb ereg search pos: примеры (PHP)
mb_ereg_search_pos(string $pattern = null, string $options = null): array|falsemb_ereg_search_pos — это функция в PHP для работы с многобайтовыми кодировками, которая выполняет поиск предварительно заданного регулярного выражения в строке и возвращает позицию первого совпадения.
Функция используется, когда требуется найти позицию (начало и длину) первого совпадения с регулярным выражением в строке, используя многобайтовую кодировку, такую как UTF-8. Она применяется после установки строки и шаблона с помощью mb_ereg_search_init.
Функция принимает два необязательных аргумента:
- pattern (string|null) — регулярное выражение для поиска. Если передан
nullили аргумент опущен, используется шаблон, заданный ранее вmb_ereg_search_init. - 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)
Возвращает массив с текстом совпадения и подмасками. Полезно, когда нужен не только позиция, но и текст совпадения.
Функции для получения и установки текущей позиции поиска в строке. Используются для итеративного поиска.
Ищет позицию первого вхождения подстроки, но не поддерживает регулярные выражения. Быстрее для простого поиска подстроки.
Функция 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 8.0 функция была изменена для более строгой обработки аргументов. Аргумент pattern теперь может быть null. Не передача строки для поиска без предварительной инициализации вызывает ошибку.
В PHP 7.3 были добавлены предупреждения о устаревании для некоторых неиспользуемых параметров в других функциях семейства mb_ereg, но на mb_ereg_search_pos это не повлияло.
В PHP 8.1 и 8.2 изменений в поведении функции не было, но рекомендуется явно указывать кодировку с помощью mb_regex_encoding или mb_internal_encoding.
Функция не возвращает текст совпадения, но можно получить позиции для всего шаблона.
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.
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'.
mb_ereg_search_init('Привет', 'ПРИВЕТ', 'i');
$result = mb_ereg_search_pos();
print_r($result);Array
(
[0] => 0
[1] => 12
[2] => 6
)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
)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.