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

Функция mb_ereg_search_getpos: получение позиции при поиске
Раздел: Многобайтовые строки
mb_ereg_search_getpos: int
Описание функции mb_ereg_search_getpos

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

Функция применяется в процессе итеративного поиска совпадений с помощью функций mb_ereg_search_init(), mb_ereg_search(), mb_ereg_search_regs(). Она позволяет получить текущую позицию в строке, с которой начнется следующий поиск.

Функция не принимает аргументов.

Возвращаемое значение — целое число (int), представляющее текущую позицию указателя в байтах. При ошибке возвращается false.

Для установки позиции используется функция mb_ereg_search_setpos().

Короткие примеры использования
Пример 1: Базовое использование
<?php
mb_regex_encoding('UTF-8');
$string = 'Пример текста';
$pattern = '\\w+';
mb_ereg_search_init($string, $pattern);

// Первый поиск
mb_ereg_search();
$pos1 = mb_ereg_search_getpos();
echo "Позиция после первого совпадения: $pos1\n";

// Второй поиск
mb_ereg_search();
$pos2 = mb_ereg_search_getpos();
echo "Позиция после второго совпадения: $pos2";
?>
Позиция после первого совпадения: 7
Позиция после второго совпадения: 13
Пример 2: Использование с mb_ereg_search_setpos
<?php
mb_regex_encoding('UTF-8');
$string = 'abc def ghi';
$pattern = '\\w+';
mb_ereg_search_init($string, $pattern);

// Установка начальной позиции
mb_ereg_search_setpos(4);
$currentPos = mb_ereg_search_getpos();
echo "Текущая позиция: $currentPos\n";

// Поиск с установленной позиции
if (mb_ereg_search()) {
    $regs = mb_ereg_search_getregs();
    echo "Найдено: " . $regs[0];
}
?>
Текущая позиция: 4
Найдено: def
Похожие функции в PHP
preg_last_error и PREG_OFFSET_CAPTURE

Для работы с позициями в регулярных выражениях PCRE (Perl Compatible Regular Expressions) используется флаг PREG_OFFSET_CAPTURE в функциях preg_match() или preg_match_all(). Этот флаг возвращает смещение найденной подстроки в байтах.

mb_strpos и mb_strrpos

Функции mb_strpos() и mb_strrpos() находят позицию первого или последнего вхождения подстроки в строке. Они подходят для простого поиска без использования регулярных выражений.

Выбор функции

Функции семейства mb_ereg_* применяются для многобайтовых строк с использованием регулярных выражений в стиле POSIX. Функции preg_* с флагом PREG_OFFSET_CAPTURE являются более современной и распространенной альтернативой для работы с позициями в совпадениях.

Типичные ошибки
Ошибка 1: Вызов до инициализации поиска

Функция возвращает false, если поиск не был инициализирован.

<?php
$pos = mb_ereg_search_getpos();
var_dump($pos);
?>
bool(false)
Ошибка 2: Несоответствие кодировки

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

<?php
mb_regex_encoding('EUC-JP');
$string = 'Пример в UTF-8';
$pattern = '\\w+';
mb_ereg_search_init($string, $pattern);
mb_ereg_search();
$pos = mb_ereg_search_getpos();
echo "Позиция: $pos"; // Может вывести некорректное значение
?>
Позиция: 0
Ошибка 3: Использование после завершения поиска

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

<?php
mb_regex_encoding('UTF-8');
$string = 'abc';
$pattern = '\\w+';
mb_ereg_search_init($string, $pattern);
mb_ereg_search(); // Находит 'abc'
mb_ereg_search(); // Больше совпадений нет
$pos = mb_ereg_search_getpos();
echo "Позиция: $pos"; // 3 - конец строки
?>
Позиция: 3
Изменения в PHP 8

В PHP 8.0 функция mb_ereg_search_getpos() была перенесена в основное расширение mbstring. Ранее она была частью модуля mbregex. Это изменение повысило согласованность расширения.

Семантика функции и возвращаемые значения в PHP 8 остались прежними. Однако, рекомендуется использовать режим mb_regex_encoding, совместимый с PHP 8.

Расширенные примеры
Пример 1: Итеративный поиск всех совпадений с отслеживанием позиций
Пример php
<?php
mb_regex_encoding('UTF-8');
$text = 'Слова: кот, собака, мышь';
$pattern = '[\\w{0410}-\\w{044F}]+';
mb_ereg_search_init($text, $pattern);
$matches = [];
while (mb_ereg_search()) {
    $regs = mb_ereg_search_getregs();
    $pos = mb_ereg_search_getpos();
    $matches[] = ['word' => $regs[0], 'next_pos' => $pos];
}
print_r($matches);
?>
Array
(
    [0] => Array
        (
            [word] => Слова
            [next_pos] => 6
        )
    [1] => Array
        (
            [word] => кот
            [next_pos] => 11
        )
    [2] => Array
        (
            [word] => собака
            [next_pos] => 20
        )
    [3] => Array
        (
            [word] => мышь
            [next_pos] => 26
        )
)
Пример 2: Поиск с пропуском части строки
Пример php
<?php
mb_regex_encoding('UTF-8');
$html = '<div>Текст1</div><div>Текст2</div>';
$pattern = '<div>([^<]+)</div>';
mb_ereg_search_init($html, $pattern);

// Пропускаем первый div
mb_ereg_search();
$pos = mb_ereg_search_getpos();
mb_ereg_search_setpos($pos);

// Ищем второй div
if (mb_ereg_search()) {
    $regs = mb_ereg_search_getregs();
    echo "Второй блок: " . $regs[1];
}
?>
Второй блок: Текст2
Пример 3: Обработка многострочного текста
Пример php
<?php
mb_regex_encoding('UTF-8');
$text = "Строка 1\nСтрока 2\nСтрока 3";
$pattern = 'Строка \\d+';
mb_ereg_search_init($text, $pattern);
while (mb_ereg_search()) {
    $regs = mb_ereg_search_getregs();
    $pos = mb_ereg_search_getpos();
    $char = mb_substr($text, $pos, 1);
    echo "Найдено: '{$regs[0]}', следуюший символ: '$char'\n";
}
?>
Найдено: 'Строка 1', следуюший символ: '
'
Найдено: 'Строка 2', следуюший символ: '
'
Найдено: 'Строка 3', следуюший символ: ''
Пример 4: Использование с пользовательским разделителем
Пример php
<?php
mb_regex_encoding('UTF-8');
mb_ereg_search_init('яблоко,груша,апельсин', '[^,]+');
while (mb_ereg_search()) {
    $regs = mb_ereg_search_getregs();
    $pos = mb_ereg_search_getpos();
    echo "Фрукт: {$regs[0]}, позиция для следующего поиска: $pos\n";
}
?>
Фрукт: яблоко, позиция для следующего поиска: 7
Фрукт: груша, позиция для следующего поиска: 14
Фрукт: апельсин, позиция для следующего поиска: 23
Альтернативы в других языках

Mb ereg search getpos в Python

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

import re
pattern = r'\\w+'
text = 'Пример текста'
match = re.search(pattern, text)
if match:
    print(f"Начало: {match.start()}, Конец: {match.end()}")
Начало: 0, Конец: 6

Mb ereg search getpos в Javascript

Объект результата выполнения регулярного выражения имеет свойство index, содержащее индекс начала совпадения.

const text = 'Пример текста';
const pattern = /\\w+/g;
const match = pattern.exec(text);
if (match) {
    console.log(`Позиция начала: ${match.index}`);
}
Позиция начала: 0

Mb ereg search getpos в MySQL

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

SELECT REGEXP_INSTR('Пример текста', '\\\\w+');
1
Отличия

В отличие от PHP, где позиция возвращается в байтах, в Python и JavaScript позиции считаются в символах (кодовых точках). В MySQL позиция возвращается в символах, но отсчет начинается с 1.

PHP mb_ereg_search_getpos function comments

En
Mb ereg search getpos Returns start point for next regular expression match