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

Поиск в многобайтовых строках с mb_ereg_search
Раздел: Многобайтовые строки
mb_ereg_search(string $pattern = null, string $options = null): bool
Описание функции mb_ereg_search

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

Использование функции

Функция обычно применяется в сценариях последовательного поиска нескольких вхождений шаблона в тексте. Для начала работы требуется инициализировать строку и шаблон с помощью mb_ereg_search_init.

Аргументы функции
  • pattern (необязательный) – строка, содержащая регулярное выражение. Если аргумент опущен, используется ранее установленный шаблон.
  • options (необязательный) – строка с дополнительными опциями. Например, "i" включает регистронезависимый поиск.

Функция возвращает true при обнаружении совпадения, иначе false.

Простые примеры работы с mb_ereg_search
Базовый поиск

Код:

mb_regex_encoding('UTF-8');
$string = "Пример текста.";
$pattern = "текста";
mb_ereg_search_init($string, $pattern);
$result = mb_ereg_search();
var_dump($result);

Результат:

bool(true)
Поиск без учета регистра

Код:

mb_regex_encoding('UTF-8');
$string = "Пример Текста.";
$pattern = "текста";
mb_ereg_search_init($string, $pattern, "i");
$result = mb_ereg_search();
var_dump($result);

Результат:

bool(true)
Поиск с возвратом позиции

Код:

mb_regex_encoding('UTF-8');
$string = "один два три";
$pattern = "\\w+";
mb_ereg_search_init($string, $pattern);
mb_ereg_search();
$pos = mb_ereg_search_getpos();
echo "Текущая позиция: $pos";

Результат:

Текущая позиция: 3
Похожие функции в PHP

В PHP существуют другие инструменты для работы с регулярными выражениями:

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

Функцию mb_ereg_search удобно применять для циклического поиска нескольких вхождений. Для одиночной проверки чаще используют preg_match.

Частые ошибки
Отсутствие инициализации

Если не вызвать mb_ereg_search_init, функция вернет false.

Код:

mb_regex_encoding('UTF-8');
$result = mb_ereg_search("шаблон");
var_dump($result);

Результат:

bool(false)
Некорректная кодировка

При несовпадении кодировки строки и установленной в mb_regex_encoding поиск может дать неверный результат.

Код:

mb_regex_encoding('ASCII');
$string = "Привет";
$pattern = "рив";
mb_ereg_search_init($string, $pattern);
$result = mb_ereg_search();
var_dump($result);

Результат:

bool(false)
Изменения в PHP

В версии PHP 7.1 параметры pattern и options стали необязательными, если ранее была выполнена инициализация через mb_ereg_search_init. В PHP 8.0 улучшена обработка ошибок и производительность расширения mbstring.

Расширенные примеры
Извлечение всех email-адресов

Код:

Пример php
mb_regex_encoding('UTF-8');
$text = "Контакты: test@example.com, admin@site.ru.";
$pattern = "[\\w.]+@[\\w.]+\\.\\w+";
mb_ereg_search_init($text, $pattern);
$emails = [];
while (mb_ereg_search()) {
    $regs = mb_ereg_search_getregs();
    $emails[] = $regs[0];
}
print_r($emails);

Результат:

Array
(
    [0] => test@example.com
    [1] => admin@site.ru
)
Поиск с использованием групп захвата

Код:

Пример php
mb_regex_encoding('UTF-8');
$text = "Цены: 100 руб, 200 руб.";
$pattern = "(\\d+) руб";
mb_ereg_search_init($text, $pattern);
while (mb_ereg_search()) {
    $regs = mb_ereg_search_getregs();
    echo "Найдена сумма: " . $regs[1] . "\n";
}

Результат:

Найдена сумма: 100
Найдена сумма: 200
Поиск с изменением позиции

Код:

Пример php
mb_regex_encoding('UTF-8');
$text = "abc def ghi";
$pattern = "\\w+";
mb_ereg_search_init($text, $pattern);
mb_ereg_search();
mb_ereg_search_setpos(5);
$regs = mb_ereg_search_getregs();
echo "Слово с позиции 5: " . $regs[0];

Результат:

Слово с позиции 5: def
Аналоги в других языках

Mb ereg search в Python

В модуле re функция re.search выполняет поиск первого совпадения.

Код:

import re
text = "Пример строки."
pattern = r"строки"
result = re.search(pattern, text)
print(result is not None)

Результат:

True

Mb ereg search в Javascript

Метод RegExp.prototype.exec позволяет последовательно находить совпадения.

Код:

let text = "Пример строки.";
let pattern = /строки/;
let result = pattern.exec(text);
console.log(result !== null);

Результат:

true

Mb ereg search в MySQL

Оператор REGEXP используется в условиях запросов.

Код:

SELECT 'Пример строки.' REGEXP 'строки';

Результат:

1

PHP mb_ereg_search function comments

En
Mb ereg search Multibyte regular expression match for predefined multibyte string