preg_last_error

(PHP 5 >= 5.2.0)

preg_last_errorВозвращает код ошибки выполнения последнего регулярного выражения PCRE

Описание

int preg_last_error ( void )

Возвращает код ошибки выполнения последнего регулярного выражения PCRE.

Пример #1 Пример использования preg_last_error()

<?php

preg_match
('/(?:\D+|<\d+>)*[!?]/''foobar foobar foobar');

if (
preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR) {
    print 
'Был исчерпан лимит обратных ссылок!';
}

?>

Результат выполнения данного примера:

Был исчерпан лимит обратных ссылок!

Возвращаемые значения

Возвращает одну из следующих констант, (описанных на отдельной странице.):

  • PREG_NO_ERROR
  • PREG_INTERNAL_ERROR
  • PREG_BACKTRACK_LIMIT_ERROR (см. также pcre.backtrack_limit)
  • PREG_RECURSION_LIMIT_ERROR (см. также pcre.recursion_limit)
  • PREG_BAD_UTF8_ERROR
  • PREG_BAD_UTF8_OFFSET_ERROR (начиная с PHP 5.3.0)

Коментарии

The above function pcre_error_deocde [sic] is not correct - not all of the used constants are errors constants. For example, when the error is actually PREG_BAD_UTF8_ERROR, the function outputs the text for PREG_SPLIT_OFFSET_CAPTURE.
2010-05-24 08:20:24
http://php5.kiev.ua/manual/ru/function.preg-last-error.html
Here is a more advanced function to convert an error code to text:

<?php

function preg_errtxt($errcode)
{
    static 
$errtext;

    if (!isset(
$errtxt))
    {
       
$errtext = array();
       
$constants get_defined_constants(true);
        foreach (
$constants['pcre'] as $c => $n) if (preg_match('/_ERROR$/'$c)) $errtext[$n] = $c;
    }

    return 
array_key_exists($errcode$errtext)? $errtext[$errcode] : NULL;
}

?>
2013-06-18 15:37:13
http://php5.kiev.ua/manual/ru/function.preg-last-error.html
Just an addition to my previous note: In unicode mode (with "u" modifier), PREG_BAD_UTF8_ERROR only reflects errors in the subject string. If the pattern itself contains invalid characters, preg_match() (or preg_match_all()) returns false but preg_last_error() returns 0 indicating PREG_NO_ERROR. Instead, php issues a warning: "preg_match(): Compilation failed: invalid UTF-8 string at offset 0"
2013-06-23 12:00:43
http://php5.kiev.ua/manual/ru/function.preg-last-error.html
In PHP 5.5 and above, getting the error message is as simple as:

<?php
echo array_flip(get_defined_constants(true)['pcre'])[preg_last_error()];
2014-01-11 16:21:18
http://php5.kiev.ua/manual/ru/function.preg-last-error.html
Take it into account before use this function.

My php --version
PHP 5.6.29 (cli) (built: Dec  8 2016 09:19:46) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

On Linux Fedora 23 4.8.13-100.fc23.x86_64 #1 SMP Fri Dec 9 14:51:40 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

<?php
// @see http://stackoverflow.com/questions/4440626/how-can-i-validate-regex

// returns true because  there is no opening "(" for the closing ")"
var_dump(preg_match('~InvalidRegular)Expression~'null) === false);

// this SHOULD be something different from 0, but...
var_dump(preg_last_error());
?>
2017-02-25 01:03:23
http://php5.kiev.ua/manual/ru/function.preg-last-error.html
Автор:
If you use T-Regx library, to get the last constant, you can use

<?php

echo preg_last_error_constant(); // 'PREG_BAD_UTF8_ERROR'
2019-08-06 22:59:06
http://php5.kiev.ua/manual/ru/function.preg-last-error.html
Автор:
Getting error as text (small update):

<?php
echo array_flip(array_filter(get_defined_constants(true)['pcre'], function($v) { return is_integer($v); }))[preg_last_error()];
2019-08-12 07:01:25
http://php5.kiev.ua/manual/ru/function.preg-last-error.html
Автор:
Here is a correction to one of the previous "get error message" snippets. It filters out the non-error codes which stops "Warning:  array_flip(): Can only flip STRING and INTEGER values!" from being emitted due to ["PCRE_JIT_SUPPORT"]=>bool(true):

<?php
echo array_flip(array_filter(get_defined_constants(true)['pcre'], function ($value) {
  return 
substr($value, -6) === '_ERROR';
}, 
ARRAY_FILTER_USE_KEY))[preg_last_error()];
2019-08-18 12:37:10
http://php5.kiev.ua/manual/ru/function.preg-last-error.html
In PHP 7.3+, and depending on the environment, there may be other constants that aren't ints which will cause errors with array_flip. I opted to go with a RegexException and a filter on gk's note.

<?php

class RegexException extends \Exception {

    public 
$errorCode;

    public function 
__construct(
       
int $errorCode,
       
string $additionalMessage null
   
) {
       
$this->errorCode $errorCode;

       
$errorMessage $this->getErrorString($errorCode) ?? 'Unknown regex error';
       
$additionalMessage $additionalMessage $additionalMessage'';

       
parent::__construct("Regex error thrown: $errorMessage." $additionalMessage);
    }

   
/**
     * Gets an error string (const name) for the PCRE error code
     *
     * @param int $errorCode
     *
     * @return string|null
     */
   
private function getErrorString(int $errorCode): ?string
   
{
       
$pcreConstants get_defined_constants(true)['pcre'] ?? [];

       
/*
         * NOTE: preg_last_error() returns an int, but there are constants
         * in PHP 7.3+ that are strings, bools, or otherwise. We can pretty
         * safely filter out the non-integers to fetch the appropriate
         * error constant name.
         */
       
$pcreConstants array_filter($pcreConstants, function ($code) {
            return 
is_int($code);
        });

       
$errorStrings array_flip($pcreConstants);

        return 
$errorStrings[$errorCode] ?? null;
    }

Usage:

throw new 
RegexException(preg_last_error());
2020-02-25 02:51:28
http://php5.kiev.ua/manual/ru/function.preg-last-error.html
Автор:
PHP 8 has a native function to retrieve the actual error message, so these helper functions are no longer necessary.

https://www.php.net/preg_last_error_msg

<?php

preg_match
('/(?:\D+|<\d+>)*[!?]/''foobar foobar foobar');

if (
preg_last_error() !== PREG_NO_ERROR) {
    echo 
preg_last_error_msg(); // Prints "Backtrack limit exhausted"
}

?>
2020-10-09 08:43:14
http://php5.kiev.ua/manual/ru/function.preg-last-error.html

    Поддержать сайт на родительском проекте КГБ