Mb ereg search getpos: примеры (PHP)
mb_ereg_search_getpos: intФункция mb_ereg_search_getpos() возвращает текущую позицию указателя для многобайтового поиска по регулярному выражению. Использование функции актуально при обработке строк в многобайтовых кодировках, таких как UTF-8.
Функция применяется в процессе итеративного поиска совпадений с помощью функций mb_ereg_search_init(), mb_ereg_search(), mb_ereg_search_regs(). Она позволяет получить текущую позицию в строке, с которой начнется следующий поиск.
Функция не принимает аргументов.
Возвращаемое значение — целое число (int), представляющее текущую позицию указателя в байтах. При ошибке возвращается false.
Для установки позиции используется функция mb_ereg_search_setpos().
<?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
<?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
Для работы с позициями в регулярных выражениях PCRE (Perl Compatible Regular Expressions) используется флаг PREG_OFFSET_CAPTURE в функциях preg_match() или preg_match_all(). Этот флаг возвращает смещение найденной подстроки в байтах.
Функции mb_strpos() и mb_strrpos() находят позицию первого или последнего вхождения подстроки в строке. Они подходят для простого поиска без использования регулярных выражений.
Функции семейства mb_ereg_* применяются для многобайтовых строк с использованием регулярных выражений в стиле POSIX. Функции preg_* с флагом PREG_OFFSET_CAPTURE являются более современной и распространенной альтернативой для работы с позициями в совпадениях.
Функция возвращает false, если поиск не был инициализирован.
<?php
$pos = mb_ereg_search_getpos();
var_dump($pos);
?>bool(false)
Если кодировка регулярного выражения и строки не совпадает с установленной через 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
После того как все совпадения найдены, функция возвращает позицию конца строки, что может быть неочевидно.
<?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.0 функция mb_ereg_search_getpos() была перенесена в основное расширение mbstring. Ранее она была частью модуля mbregex. Это изменение повысило согласованность расширения.
Семантика функции и возвращаемые значения в PHP 8 остались прежними. Однако, рекомендуется использовать режим mb_regex_encoding, совместимый с PHP 8.
<?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
)
)<?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
<?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', следуюший символ: ''
<?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.