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

Использование функции mb_ereg_search_init для поиска в PHP
Раздел: Многобайтовые строки
mb_ereg_search_init(string $string, string $pattern = null, string $options = null): bool

Функция mb_ereg_search_init

Функция mb_ereg_search_init в PHP подготавливает строку и шаблон для выполнения многобайтового регулярного поиска. Она используется совместно с функциями mb_ereg_search, mb_ereg_search_pos и mb_ereg_search_regs для итеративного поиска совпадений в строке с учетом многобайтовых кодировок.

Аргументы функции
  • $string - строка, в которой будет производиться поиск.
  • $pattern - шаблон регулярного выражения. Если аргумент не указан, используется шаблон из предыдущего вызова mb_ereg_search_init или mb_ereg_search.
  • $options - опции поиска. Может включать флаги, такие как "i" для регистронезависимого поиска.

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

Простой поиск с инициализацией
<?php
$string = 'Привет, мир!';
$pattern = 'мир';
mb_ereg_search_init($string, $pattern);
$result = mb_ereg_search();
var_dump($result);
?>
bool(true)
Поиск с флагом регистронезависимости
<?php
$string = 'Привет, Мир!';
$pattern = 'мир';
mb_ereg_search_init($string, $pattern, 'i');
$result = mb_ereg_search();
var_dump($result);
?>
bool(true)
Итеративный поиск нескольких вхождений
<?php
$string = 'ааа ббб ааа';
$pattern = 'ааа';
mb_ereg_search_init($string, $pattern);
while ($result = mb_ereg_search()) {
    $match = mb_ereg_search_getregs();
    echo "Найдено: " . $match[0] . "\n";
}
?>
Найдено: ааа
Найдено: ааа

Похожие функции в PHP

Для работы с регулярными выражениями в PHP доступны функции в нескольких расширениях.

Функции расширения PCRE

Функции preg_match, preg_match_all и другие из расширения PCRE также поддерживают многобайтовые строки при использовании модификатора u. Они часто быстрее и имеют более богатый синтаксис шаблонов.

Функции расширения mbstring

Функции mb_ereg_match, mb_ereg_replace и другие из того же расширения. Они специализированы для многобайтовых строк, но могут уступать в производительности.

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

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

Типичные ошибки

Отсутствие установленной кодировки

Если не установлена внутренняя кодировка с помощью mb_regex_encoding, функция может работать некорректно.

<?php
$string = 'Привет';
$pattern = 'Привет';
// Не установлена кодировка
mb_ereg_search_init($string, $pattern);
$result = mb_ereg_search();
var_dump($result);
?>
Может вернуть false или вызвать предупреждение
Использование без последующего поиска

Функция только инициализирует поиск, но не выполняет его. Для получения результата требуется вызвать mb_ereg_search.

<?php
$string = 'Пример';
$pattern = 'Пример';
mb_ereg_search_init($string, $pattern);
// Забыли вызвать mb_ereg_search()
?>
Ничего не происходит
Некорректный шаблон

Если шаблон содержит синтаксические ошибки, функция может вернуть false или выдать предупреждение.

<?php
$string = 'Текст';
$pattern = '['; // Неправильный шаблон
$result = mb_ereg_search_init($string, $pattern);
var_dump($result);
?>
bool(false)

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

В PHP 8.0 функция mb ereg search init была изменена: параметр pattern теперь может принимать значение null. Это позволяет явно указать, что следует использовать предыдущий шаблон.

До PHP 8.0, если требовалось использовать предыдущий шаблон, аргумент просто опускали. Теперь можно явно передать null, что улучшает читаемость кода.

Расширенные примеры использования

Поиск с захватом групп
Пример php
<?php
mb_regex_encoding('UTF-8');
$string = 'Иванов Иван Иванович';
$pattern = '^(\w+)\s+(\w+)\s+(\w+)$';
mb_ereg_search_init($string, $pattern);
if (mb_ereg_search()) {
    $regs = mb_ereg_search_getregs();
    echo "Фамилия: " . $regs[1] . "\n";
    echo "Имя: " . $regs[2] . "\n";
    echo "Отчество: " . $regs[3] . "\n";
}
?>
Фамилия: Иванов
Имя: Иван
Отчество: Иванович
Поиск с использованием позиции
Пример php
<?php
mb_regex_encoding('UTF-8');
$string = 'abc abc abc';
$pattern = 'abc';
mb_ereg_search_init($string, $pattern);
$positions = [];
while (mb_ereg_search()) {
    $pos = mb_ereg_search_pos();
    $positions[] = $pos[0];
}
print_r($positions);
?>
Array
(
    [0] => 0
    [1] => 4
    [2] => 8
)
Поиск с разными кодировками
Пример php
<?php
// Установка кодировки SJIS для работы с японским текстом
mb_regex_encoding('SJIS');
$string = mb_convert_encoding('日本語', 'SJIS', 'UTF-8');
$pattern = mb_convert_encoding('日本語', 'SJIS', 'UTF-8');
mb_ereg_search_init($string, $pattern);
$result = mb_ereg_search();
var_dump($result);
?>
bool(true)

Альтернативы в других языках

Mb ereg search init в Python

Модуль re для работы с регулярными выражениями. По умолчанию работает с многобайтовыми строками Unicode.

import re
string = 'Привет, мир!'
pattern = re.compile('мир')
result = pattern.search(string)
print(result is not None)
True

Mb ereg search init в Javascript

Объект RegExp и методы String, такие как match или matchAll. JavaScript строки представляют собой последовательности кодовых единиц UTF-16.

let string = 'Привет, мир!';
let pattern = /мир/;
let result = string.match(pattern);
console.log(result !== null);
true

Mb ereg search init в MySQL

Оператор REGEXP для поиска по шаблону в запросах. Работает с многобайтовыми кодировками, если установлена соответствующая кодировка соединения.

SELECT 'Привет, мир!' REGEXP 'мир' AS result;
result: 1

PHP mb_ereg_search_init function comments

En
Mb ereg search init Setup string and regular expression for a multibyte regular expression match