Preg last error msg: примеры (PHP)
preg_last_error_msg: stringФункция 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 classini_set('pcre.backtrack_limit', 1);
$result = preg_match('/(\\d+)*b/', str_repeat('1', 1000) . 'b');
echo preg_last_error_msg();Backtrack limit exhaustedpreg_match('/\\d+/', '123');
echo preg_last_error_msg();No errorpreg_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(); // Нет предыдущих операций PCRENo 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.
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$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_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 exhaustedimport re
try:
re.compile('[[invalid')
except re.error as e:
print(e)missing ] at position 1try {
new RegExp('[invalid');
} catch (e) {
console.log(e.message);
}Unterminated character classMySQL не предоставляет отдельной функции для получения сообщения об ошибке регулярного выражения. Ошибки приводят к возврату NULL или возникновению общей ошибки запроса.
SELECT 'abc' REGEXP '[';NULL