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

Функция mb_ereg_search_getregs: практическое руководство с примерами
Раздел: Многобайтовые строки
mb_ereg_search_getregs: array|false

Основы функции mb_ereg_search_getregs

Функция mb_ereg_search_getregs() является частью мультибайтового расширения PHP (mbstring) и используется для работы с регулярными выражениями в многобайтовых кодировках. Она возвращает результат последнего успешного поиска с помощью функций mb_ereg_search() или mb_ereg_search_pos().

Когда используется

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

Аргументы функции

Функция не принимает параметров. Её вызов выглядит как mb_ereg_search_getregs(). Однако она работает в связке с другими функциями мультибайтовых регулярных выражений, которые настраивают параметры поиска.

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

Пример 1: Базовое использование

Поиск слова в тексте:

mb_regex_encoding('UTF-8');
$string = "Пример текста на русском языке";
$pattern = "русском";

if (mb_ereg_search_init($string, $pattern)) {
    if (mb_ereg_search()) {
        $result = mb_ereg_search_getregs();
        print_r($result);
    }
}
Array
(
    [0] => русском
)
Пример 2: Использование с группами захвата
mb_regex_encoding('UTF-8');
$string = "Иван: 25 лет, Мария: 30 лет";
$pattern = "([^:]+): (\\d+) лет";

mb_ereg_search_init($string, $pattern);
$matches = [];
while ($matches[] = mb_ereg_search_getregs()) {
    if (!mb_ereg_search()) break;
}
print_r($matches);
Array
(
    [0] => Array
        (
            [0] => Иван: 25 лет
            [1] => Иван
            [2] => 25
        )
    [1] => Array
        (
            [0] => Мария: 30 лет
            [1] => Мария
            [2] => 30
        )
)

Альтернативные функции в PHP

preg_match

Функция preg_match() работает с регулярными выражениями PCRE и поддерживает UTF-8 через модификатор 'u'. Она обычно быстрее и имеет более богатый синтаксис.

Функция mb_ereg_match() проверяет соответствие строки шаблону, но не возвращает найденные подстроки.

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

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

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

Ошибка 1: Не установлена кодировка
// Неправильно:
$string = "Текст";
$pattern = "Т";
mb_ereg_search_init($string, $pattern);
mb_ereg_search();
$result = mb_ereg_search_getregs(); // Может вернуть false
Ошибка 2: Поиск без инициализации
// Неправильно:
$result = mb_ereg_search_getregs(); // Вернет false
bool(false)
Ошибка 3: Неправильная обработка результата
mb_regex_encoding('UTF-8');
$string = "Текст";
$pattern = "Несуществующий";
mb_ereg_search_init($string, $pattern);
mb_ereg_search();
$result = mb_ereg_search_getregs();
echo $result[0]; // Ошибка если $result = false

Изменения в новых версиях PHP

PHP 7.3

Добавлена поддержка именованных захватывающих групп в стиле PCRE через синтаксис (?...).

PHP 8.0

Улучшена обработка ошибок - некоторые функции теперь выбрасывают исключения вместо возврата false.

PHP 8.2

Оптимизирована работа с памятью при обработке больших строк.

Расширенные примеры

Пример 1: Извлечение данных из сложного текста
Пример php
mb_regex_encoding('UTF-8');
$text = "Контакты: email1@test.com, тел: +7-999-123-45-67, email2@example.org";
$pattern = '([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})';

mb_ereg_search_init($text, $pattern);
$emails = [];
while (mb_ereg_search()) {
    $matches = mb_ereg_search_getregs();
    $emails[] = $matches[0];
}
print_r($emails);
Array
(
    [0] => email1@test.com
    [1] => email2@example.org
)
Пример 2: Многострочный поиск с флагами
Пример php
mb_regex_encoding('UTF-8');
$text = "Строка 1\nСтрока 2\nСтрока 3";
$pattern = "строка";

mb_ereg_search_init($text, $pattern, 'i'); // 'i' - регистронезависимый поиск
$results = [];
while (mb_ereg_search()) {
    $results[] = mb_ereg_search_getregs()[0];
}
print_r($results);
Array
(
    [0] => Строка
    [1] => Строка
    [2] => Строка
)
Пример 3: Работа с кириллицей и юникодом
Пример php
mb_regex_encoding('UTF-8');
$text = "Слово1 Слово2 Слово3";
$pattern = '([\\p{Cyrillic}]+\\d)'; // Кириллические символы с цифрой

mb_ereg_search_init($text, $pattern);
$found = [];
while (mb_ereg_search()) {
    $found[] = mb_ereg_search_getregs()[0];
}
print_r($found);
Array
(
    [0] => Слово1
    [1] => Слово2
    [2] => Слово3
)

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

Mb ereg search getregs в Python

Модуль re предоставляет методы search и findall:

import re
pattern = r'([^:]+): (\\d+) лет'
text = "Иван: 25 лет, Мария: 30 лет"
matches = re.findall(pattern, text)
print(matches)
[('Иван', '25'), ('Мария', '30')]

Mb ereg search getregs в Javascript

Метод match у строки с флагом 'g' для глобального поиска:

const text = "Иван: 25 лет, Мария: 30 лет";
const pattern = /([^:]+): (\\d+) лет/g;
let matches = [];
let match;
while ((match = pattern.exec(text)) !== null) {
    matches.push(match);
}
console.log(matches);

Mb ereg search getregs в MySQL

Функция REGEXP_SUBSTR для извлечения совпадений:

SELECT REGEXP_SUBSTR('Иван: 25 лет', '[^:]+') as name;
Иван

PHP mb_ereg_search_getregs function comments

En
Mb ereg search getregs Retrieve the result from the last multibyte regular expression match