Mb regex set options: примеры (PHP)
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 устарел и удален в 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: Добавлена возможность устанавливать кодировку через эту функцию.
Расширенные примеры
<?
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
<?
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] => третья
)
<?
mb_regex_set_options('x'); // Игнорировать пробелы в шаблоне
$pattern = '
^ # Начало строки
\d{3,5} # От 3 до 5 цифр
-? # Необязательный дефис
[a-z]+ # Одна или больше букв
$ # Конец строки
';
$string = "12345-test";
if (mb_ereg($pattern, $string)) {
echo "Строка соответствует сложному шаблону";
}
?>
Строка соответствует сложному шаблону
<?
// Пример для специфической кодировки (требует расширения mbstring)
mb_regex_encoding('EUC-JP');
mb_regex_set_options('prjis'); // Установка опций для JIS
// ... операции с регулярными выражениями для строк в EUC-JP ...
echo "Текущие опции для JIS: " . mb_regex_set_options();
?>
Текущие опции для JIS: prjis
Альтернативы в других языках
re)
В Python флаги передаются как аргумент функции или как часть строки шаблона. Глобальных настроек, аналогичных mb_regex_set_options, нет.
import re
pattern = re.compile(r'мир', re.IGNORECASE)
if pattern.search('Привет Мир'):
print('Найдено')
Найдено
В JavaScript флаги указываются в конце литерала регулярного выражения или передаются в конструктор RegExp. Глобальных настроек нет.
let str = "Привет Мир";
let regex = /мир/i;
if (regex.test(str)) {
console.log('Найдено');
}
Найдено
В операторах REGEXP/RLIKE можно использовать только флаги, специфичные для движка (чаще всего регистронезависимость зависит от collation столбца). Отдельной функции для глобальной установки опций нет.
SELECT 'Привет Мир' REGEXP 'мир';
-- Результат зависит от collation соединения/столбца.