Preg last error msg: примеры (PHP)

Использование preg_last_error_msg для отладки регулярных выражений
Раздел: Регулярные выражения
preg_last_error_msg: string
Описание функции preg_last_error_msg

Функция preg_last_error_msg() возвращает текстовое описание последней ошибки, возникшей при выполнении функций PCRE (Perl Compatible Regular Expressions). Эта функция была введена в PHP 8 как улучшенная замена preg_last_error(), возвращающей только числовой код ошибки.

Использование функции актуально при отладке и обработке ошибок регулярных выражений в таких функциях как preg_match(), preg_replace(), preg_split() и других. Функция не принимает аргументов.

Возвращаемое значение — строка с описанием ошибки или "No error" при отсутствии ошибок. Сообщения соответствуют предопределенным константам PCRE, таким как PREG_INTERNAL_ERROR, PREG_BACKTRACK_LIMIT_ERROR и другим.

Короткие примеры использования
Пример с синтаксической ошибкой в шаблоне
$result = preg_match('/[invalid/', 'test');
echo preg_last_error_msg();
Compilation failed: missing terminating ] for character class
Пример превышения лимита backtracking
ini_set('pcre.backtrack_limit', 1);
$result = preg_match('/(\\d+)*b/', str_repeat('1', 1000) . 'b');
echo preg_last_error_msg();
Backtrack limit exhausted
Отсутствие ошибки
preg_match('/\\d+/', '123');
echo preg_last_error_msg();
No error
Похожие функции в PHP

preg_last_error() — возвращает числовой код последней ошибки PCRE. Используется в PHP версий до 8.0 или когда необходим именно код для логирования или сравнения.

error_get_last() — возвращает последнюю ошибку PHP, но не специализирована для PCRE. Может использоваться для общего мониторинга ошибок.

Предпочтительнее использовать preg_last_error_msg() в PHP 8 и выше для получения читаемых сообщений. Для обратной совместимости или программной обработки кодов ошибок подойдет preg_last_error().

Типичные ошибки при использовании
Проверка без выполнения регулярного выражения

Ошибка возникает при вызове функции до выполнения каких-либо операций с PCRE.

echo preg_last_error_msg(); // Нет предыдущих операций PCRE
No error
Невнимание к сбросу ошибок

Каждый вызов функции PCRE перезаписывает предыдущую ошибку. Если не проверять ошибку сразу, она может быть потеряна.

preg_match('/[invalid/', 'test');
preg_match('/\\d+/', '123'); // Перезаписывает ошибку
echo preg_last_error_msg();
No error
История изменений функции

Функция была добавлена в PHP 8.0.0 как часть улучшения обработки ошибок регулярных выражений. В более ранних версиях использовалась комбинация preg_last_error() и сопоставления кодов с сообщениями вручную.

Начиная с PHP 8.0, функция возвращает сообщения на английском языке, которые не локализуются. Поведение функции и возвращаемые сообщения стабильны в рамках минорных версий PHP 8.

Расширенные примеры использования
Обработка ошибок в пользовательской функции-обертке
Пример php
function safePregMatch($pattern, $subject) {
    $result = preg_match($pattern, $subject);
    if ($result === false) {
        throw new Exception('PCRE error: ' . preg_last_error_msg());
    }
    return $result;
}

try {
    safePregMatch('/[invalid/', 'test');
} catch (Exception $e) {
    echo $e->getMessage();
}
PCRE error: Compilation failed: missing terminating ] for character class
Мониторинг нескольких операций с регулярными выражениями
Пример php
$patterns = ['/\\d+/', '/[invalid/', '/^[a-z]+$/'];
$results = [];

foreach ($patterns as $pattern) {
    preg_match($pattern, 'test123');
    $results[$pattern] = preg_last_error_msg();
}

print_r($results);
Array
(
    [/\\d+/] => No error
    [/[invalid/] => Compilation failed: missing terminating ] for character class
    [/^[a-z]+$/] => No error
)
Совместное использование с preg_last_error()
Пример php
preg_match('/(\\d+)*b/', str_repeat('1', 1000) . 'b');
if (preg_last_error() !== PREG_NO_ERROR) {
    echo 'Код ошибки: ' . preg_last_error() . '\n';
    echo 'Сообщение: ' . preg_last_error_msg();
}
Код ошибки: 2
Сообщение: Backtrack limit exhausted
Аналоги в других языках
Python: re.error
import re
try:
    re.compile('[[invalid')
except re.error as e:
    print(e)
missing ] at position 1
JavaScript: RegExp и исключения
try {
    new RegExp('[invalid');
} catch (e) {
    console.log(e.message);
}
Unterminated character class
MySQL: REGEXP и функция REGEXP_INSTR

MySQL не предоставляет отдельной функции для получения сообщения об ошибке регулярного выражения. Ошибки приводят к возврату NULL или возникновению общей ошибки запроса.

SELECT 'abc' REGEXP '[';
NULL

PHP preg_last_error_msg function comments

En
Preg last error msg Returns the error message of the last PCRE regex execution