Mb regex set options: примеры (PHP)

Настройка параметров многобайтовых регулярных выражений через mb_regex_set_options
Раздел: Многобайтовые строки
mb_regex_set_options(?string $options = null): string

Функция mb_regex_set_options устанавливает или получает опции по умолчанию для многобайтовых регулярных выражений, обрабатываемых функциями модуля mbstring (например, mb_ereg, mb_eregi).

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

Её применяют, когда необходимо глобально изменить поведение функций многобайтовых регулярных выражений для всех последующих вызовов в скрипте, без необходимости указывать опции каждый раз. Это полезно для установки предпочтений кодировки, режима сравнения и других флагов.

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

Функция принимает один необязательный аргумент:

  • $options (string|null) – Строка опций для установки. Если передана null или строка, функция устанавливает новые опции и возвращает предыдущие. Если аргумент опущен, функция возвращает текущие установленные опции, не изменяя их.

Строка опций может содержать следующие параметры:

  • m – Многострочный режим. Символы ^ и $ совпадают с началом и концом каждой строки.
  • i – Регистронезависимый поиск.
  • x – Игнорировать пробелы и комментарии в шаблоне.
  • s – Режим «одна строка». Символ . совпадает с любым символом, включая перевод строки.
  • p – Режим, аналогичный s, но . не совпадает с переводом строки.
  • l – Находить самую длинную возможную совпадающую подстроку.
  • n – Игнорировать пустые совпадения.
  • j – Включить поддержку совместимости с Perl (PCRE).
  • e – Использовать функцию eval() для замены в mb_ereg_replace() (устаревший и опасный).

Также можно указать кодировку, например: "utf-8" или "jis".

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

Получение текущих опций
<?
echo "Текущие опции: " . mb_regex_set_options();
?>
Текущие опции: pr
Установка новых опций
<?
$old_options = mb_regex_set_options('mis');
echo "Старые опции: $old_options\n";
echo "Новые опции: " . mb_regex_set_options();
?>
Старые опции: pr
Новые опции: mis
Установка опций с кодировкой
<?
mb_regex_set_options('msiutf-8');
echo "Опции с кодировкой: " . mb_regex_set_options();
?>
Опции с кодировкой: msiutf-8
Влияние на функции
<?
mb_regex_set_options('i'); // Включаем регистронезависимость
$string = "Привет Мир";
if (mb_ereg('мир', $string)) {
    echo "Найдено совпадение\n";
}
?>
Найдено совпадение

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

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

  • Функции preg_* (PCRE) – Библиотека PCRE часто быстрее и функциональнее для большинства задач. Используют флаги, передаваемые непосредственно в функцию (например, /pattern/i). Предпочтительнее для нового кода, если не требуется специфическая многобайтовая обработка в старых кодировках.
  • mb_ereg, mb_eregi, mb_ereg_replace – Функции того же модуля mbstring, на которые влияет mb_regex_set_options. Их используют, когда работа ведется с не-UTF-8 многобайтовыми кодировками (например, SJIS, EUC-JP) или в легаси-коде.

Выбор зависит от кодировки строк и требований к производительности. Для UTF-8 чаще выбирают PCRE. Модуль mbstring актуален для восточных языков со специфическими кодировками.

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

Непонимание глобальности изменений

Установка опций влияет на весь последующий код в скрипте, что может привести к неожиданным побочным эффектам.

<?
mb_regex_set_options('i');
// ... много кода ...
// Где-то позже, когда регистр важен:
if (mb_ereg('^[A-Z]', 'test')) { // Сработает из-за флага 'i', хотя ожидалось нет
    echo "Ошибка: совпадение найдено неожиданно";
}
?>
Использование устаревшего флага 'e'

Флаг e устарел и удален в PHP 8. Его использование вызывает ошибку.

<?
// В PHP 7.x выдаст предупреждение, в PHP 8.x - фатальная ошибка.
mb_regex_set_options('e');
?>
Fatal error: Uncaught ValueError: ...
Передача некорректной кодировки
<?
// Если переданная кодировка не поддерживается mbstring
$result = @mb_regex_set_options('msiINVALID-ENCODING');
if (mb_regex_set_options() !== 'msiINVALID-ENCODING') {
    echo "Кодировка не была установлена";
}
?>
Кодировка не была установлена

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

  • PHP 8.0: Удален флаг e (выполнение кода через eval() в mb_ereg_replace()). Попытка его установить вызывает исключение ValueError. Тип возвращаемого значения и аргумента теперь явно объявлен как ?string.
  • PHP 7.3: Флаг e объявлен устаревшим.
  • PHP 5.4.6, 5.3.16: Добавлена возможность устанавливать кодировку через эту функцию.

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

Временное изменение и восстановление опций
Пример php
<?
function processWithCaseInsensitive($string, $pattern) {
    $originalOptions = mb_regex_set_options();
    mb_regex_set_options($originalOptions . 'i'); // Добавляем флаг i
    $result = mb_ereg_match($pattern, $string);
    mb_regex_set_options($originalOptions); // Восстанавливаем
    return $result;
}

$globalOpts = mb_regex_set_options('ms');
echo "Глобально: " . mb_regex_set_options() . "\n";
$test = processWithCaseInsensitive('Строка', 'СТРОКА');
echo "Результат функции: " . ($test ? 'да' : 'нет') . "\n";
echo "Глобально после: " . mb_regex_set_options() . "\n";
?>
Глобально: ms
Результат функции: да
Глобально после: ms
Комбинирование флагов для многострочного разбора
Пример php
<?
mb_regex_set_options('msi'); // Многострочный, одна строка, регистронезависимый
$text = "Первая строка\nВторая Строка\nтретья";
$lines = [];
mb_ereg_search_init($text, '^.*$');
while ($matches = mb_ereg_search_regs()) {
    $lines[] = $matches[0];
}
print_r($lines);
?>
Array
(
    [0] => Первая строка
    [1] => Вторая Строка
    [2] => третья
)
Использование флага 'x' для читаемого шаблона
Пример php
<?
mb_regex_set_options('x'); // Игнорировать пробелы в шаблоне
$pattern = '
    ^           # Начало строки
    \d{3,5}    # От 3 до 5 цифр
    -?         # Необязательный дефис
    [a-z]+     # Одна или больше букв
    $          # Конец строки
';
$string = "12345-test";
if (mb_ereg($pattern, $string)) {
    echo "Строка соответствует сложному шаблону";
}
?>
Строка соответствует сложному шаблону
Работа с кодировкой JIS
Пример php
<?
// Пример для специфической кодировки (требует расширения mbstring)
mb_regex_encoding('EUC-JP');
mb_regex_set_options('prjis'); // Установка опций для JIS
// ... операции с регулярными выражениями для строк в EUC-JP ...
echo "Текущие опции для JIS: " . mb_regex_set_options();
?>
Текущие опции для JIS: prjis

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

Python (модуль re)

В Python флаги передаются как аргумент функции или как часть строки шаблона. Глобальных настроек, аналогичных mb_regex_set_options, нет.

import re
pattern = re.compile(r'мир', re.IGNORECASE)
if pattern.search('Привет Мир'):
    print('Найдено')
Найдено
JavaScript

В JavaScript флаги указываются в конце литерала регулярного выражения или передаются в конструктор RegExp. Глобальных настроек нет.

let str = "Привет Мир";
let regex = /мир/i;
if (regex.test(str)) {
    console.log('Найдено');
}
Найдено
MySQL

В операторах REGEXP/RLIKE можно использовать только флаги, специфичные для движка (чаще всего регистронезависимость зависит от collation столбца). Отдельной функции для глобальной установки опций нет.

SELECT 'Привет Мир' REGEXP 'мир';
-- Результат зависит от collation соединения/столбца.

PHP mb_regex_set_options function comments

En
Mb regex set options Set/Get the default options for mbregex functions