preg_last_error

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

preg_last_errorReturns the error code of the last PCRE regex execution

Опис

preg_last_error(): int

Returns the error code of the last PCRE regex execution.

Приклад #1 preg_last_error() example

<?php

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

if (
preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR) {
echo
'Backtrack limit was exhausted!';
}

?>

Поданий вище приклад виведе:

Backtrack limit was exhausted!

Параметри

У цієї функції немає параметрів.

Прогляньте також

add a note

User Contributed Notes 10 notes

up
15
gk at anuary dot com
11 years ago
In PHP 5.5 and above, getting the error message is as simple as:<?phpecho array_flip(get_defined_constants(true)['pcre'])[preg_last_error()];
up
6
Daniel Klein
5 years ago
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):<?phpecho array_flip(array_filter(get_defined_constants(true)['pcre'], function ($value) {  return substr($value, -6) === '_ERROR';}, ARRAY_FILTER_USE_KEY))[preg_last_error()];
up
9
andre at koethur dot de
12 years ago
Here is a more advanced function to convert an error code to text:<?phpfunction 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;}?>
up
1
eu at ericruiz dot com dot br
8 years ago
Take it into account before use this function.My php --versionPHP 5.6.29 (cli) (built: Dec  8 2016 09:19:46) Copyright (c) 1997-2016 The PHP GroupZend Engine v2.6.0, Copyright (c) 1998-2016 Zend TechnologiesOn 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());?>
up
2
johan at bluemoonit dot net
15 years ago
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.
up
1
andre at koethur dot de
12 years ago
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"
up
2
nicoSWD
4 years ago
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<?phppreg_match('/(?:\D+|<\d+>)*[!?]/', 'foobar foobar foobar');if (preg_last_error() !== PREG_NO_ERROR) {    echo preg_last_error_msg(); // Prints "Backtrack limit exhausted"}?>
up
1
zerodahero at gmail dot com
5 years ago
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.<?phpclass 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());
up
0
Anonymous
6 years ago
If you use T-Regx library, to get the last constant, you can use<?phpecho preg_last_error_constant(); // 'PREG_BAD_UTF8_ERROR'
up
-1
Vladimir Valikaev
5 years ago
Getting error as text (small update):<?phpecho array_flip(array_filter(get_defined_constants(true)['pcre'], function($v) { return is_integer($v); }))[preg_last_error()];
To Top