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

Использование mb_ereg_search_regs для поиска в многобайтовых строках
Раздел: Многобайтовые строки
mb_ereg_search_regs(string $pattern = null, string $options = null): array|false

Функция mb_ereg_search_regs в PHP

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

Основные аргументы

Функция имеет несколько вариантов сигнатуры:

  • mb_ereg_search_regs(?string $pattern = null, ?string $options = null): array|false — основная форма.
  • mb_ereg_search_regs(?string $pattern = null): array|false — без указания опций.
Параметры
  • pattern (необязательный) — строка с регулярным выражением. Если параметр не указан, используется предыдущий паттерн, заданный через mb_ereg_search_init().
  • options (необязательный) — строка с опциями поиска. Может включать: "i" для регистронезависимого поиска, "x" для игнорирования пробелов, "m" для многострочного режима.
Возвращаемое значение

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

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

Базовый пример поиска
mb_regex_encoding('UTF-8');
$string = 'Привет, мир!';
mb_ereg_search_init($string, 'мир');
$result = mb_ereg_search_regs();
print_r($result);
Array
(
    [0] => мир
)
Использование подмасок
mb_regex_encoding('UTF-8');
$string = 'Иван Петров';
$pattern = '(\\w+)\\s+(\\w+)';
mb_ereg_search_init($string, $pattern);
$result = mb_ereg_search_regs();
print_r($result);
Array
(
    [0] => Иван Петров
    [1] => Иван
    [2] => Петров
)
Применение флага регистронезависимости
mb_regex_encoding('UTF-8');
$string = 'Пример Строки';
$pattern = 'строка';
mb_ereg_search_init($string, $pattern);
$result = mb_ereg_search_regs($pattern, 'i');
print_r($result);
Array
(
    [0] => Строки
)

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

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

preg_match()

Функция preg_match() работает с регулярками в кодировке PCRE (Perl Compatible Regular Expressions). Она быстрее функций семейства mb_ereg, но изначально не поддерживает многобайтовые кодировки. Для работы с UTF-8 необходимо использовать модификатор u.

Когда использовать

preg_match() предпочтительнее для большинства задач, особенно при работе с UTF-8 и использованием модификатора u. Функции mb_ereg стоит применять при обработке текстов в различных многобайтовых кодировках, когда требуется явное указание кодировки через mb_regex_encoding().

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

Типичные ошибки при использовании

Не установлена кодировка регулярных выражений

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

$string = 'Привет';
$pattern = 'рив';
// mb_regex_encoding не вызвана
mb_ereg_search_init($string, $pattern);
$result = mb_ereg_search_regs();
var_dump($result);
bool(false)
Неправильный синтаксис регулярного выражения

Синтаксис регулярных выражений в функциях mb_ereg отличается от PCRE. Например, для границы слова используется [[<:]] и [[>:]], а не \\b.

mb_regex_encoding('UTF-8');
$string = 'Слово текст';
$pattern = '\\bтекст\\b'; // Неправильно для mb_ereg
mb_ereg_search_init($string, $pattern);
$result = mb_ereg_search_regs();
var_dump($result);
bool(false)
Обработка ложного возвращаемого значения

Функция возвращает false как при отсутствии совпадений, так и при ошибках. Важно отличать эти случаи.

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

В PHP 8.0 произошли значительные изменения в функциях многобайтовых регулярных выражений.

Строгая типизация

Начиная с PHP 8.0, параметры pattern и options могут принимать значение null. Ранее можно было передавать пустую строку.

Изменение поведения при ошибках

В PHP 8.0 функции mb_ereg при ошибке в регулярном выражении возвращают false и генерируют предупреждение. В предыдущих версиях могла возвращаться пустая строка или происходить другие неявные поведения.

Улучшение производительности

Были оптимизированы внутренние механизмы работы с многобайтовыми строками, что повысило скорость выполнения функций семейства mb_ereg в PHP 8.x.

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

Поиск всех совпадений в цикле
Пример php
mb_regex_encoding('UTF-8');
$string = 'test1 test2 test3';
$pattern = 'test\\d';
mb_ereg_search_init($string, $pattern);
$matches = [];
while ($match = mb_ereg_search_regs()) {
    $matches[] = $match[0];
    mb_ereg_search_setpos(mb_ereg_search_getpos() + mb_strlen($match[0]));
}
print_r($matches);
Array
(
    [0] => test1
    [1] => test2
    [2] => test3
)
Использование именованных подмасок
Пример php
mb_regex_encoding('UTF-8');
$string = 'Дата: 2023-12-31';
$pattern = '(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})';
mb_ereg_search_init($string, $pattern);
$result = mb_ereg_search_regs();
if ($result) {
    echo "Год: {$result['year']}, Месяц: {$result['month']}, День: {$result['day']}";
}
Год: 2023, Месяц: 12, День: 31
Обработка многострочного текста
Пример php
mb_regex_encoding('UTF-8');
$text = "Строка 1\nСтрока 2\nСтрока 3";
$pattern = '^Строка\\s+(\\d+)$';
mb_ereg_search_init($text, $pattern, 'm');
$lines = [];
while ($match = mb_ereg_search_regs()) {
    $lines[] = $match[1];
}
print_r($lines);
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Комбинирование флагов
Пример php
mb_regex_encoding('UTF-8');
$string = 'ТЕКСТ Пример';
$pattern = 'текст пример';
mb_ereg_search_init($string, $pattern);
$result = mb_ereg_search_regs($pattern, 'ix');
print_r($result);
Array
(
    [0] => ТЕКСТ Пример
)

Аналоги функции в других языках

Python: re.search()

Модуль re в Python предоставляет функцию search() для поиска первого совпадения с регуляркой. По умолчанию поддерживает Unicode.

import re
string = 'Привет, мир!'
pattern = r'мир'
match = re.search(pattern, string)
if match:
    print(match.group())
мир
JavaScript: match()

Метод match() строк в JavaScript выполняет поиск совпадений с регулярным выражением. Для глобального поиска используется флаг g.

const string = 'Привет, мир!';
const pattern = /мир/;
const result = string.match(pattern);
console.log(result[0]);
мир
MySQL: REGEXP_SUBSTR()

Функция REGEXP_SUBSTR() в MySQL возвращает подстроку, соответствующую регулярному выражению. Работает с многобайтовыми кодировками при корректной настройке кодировки соединения.

SELECT REGEXP_SUBSTR('Привет, мир!', 'мир');
мир

PHP mb_ereg_search_regs function comments

En
Mb ereg search regs Returns the matched part of a multibyte regular expression