preg_last_error

(PHP 5 >= 5.2.0, PHP 7)

preg_last_error返回最后一个PCRE正则执行产生的错误代码

说明

int preg_last_error ( void )

返回最后一次PCRE正则执行的错误代码。

Example #1 preg_last_error() 示例

<?php

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

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

?>

以上例程会输出:

Backtrack limit was exhausted!

返回值

返回下面常量中的一个(查看它们自身的解释):

  • 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 起)
  • PREG_JIT_STACKLIMIT_ERROR (自 PHP 7.0.0 起)

User Contributed Notes

eu at ericruiz dot com dot br 25-Feb-2017 08:03
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());
?>
gk at anuary dot com 11-Jan-2014 11:21
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()];
andre at koethur dot de 23-Jun-2013 06:00
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"
andre at koethur dot de 18-Jun-2013 09:37
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;
}

?>
Omer 12-Feb-2011 06:22
here's the code to check for all errors
<?php
if (preg_last_error() == PREG_NO_ERROR) {
    print
'There is no error.';
}
else if (
preg_last_error() == PREG_INTERNAL_ERROR) {
    print
'There is an internal error!';
}
else if (
preg_last_error() == PREG_BACKTRACK_LIMIT_ERROR) {
    print
'Backtrack limit was exhausted!';
}
else if (
preg_last_error() == PREG_RECURSION_LIMIT_ERROR) {
    print
'Recursion limit was exhausted!';
}
else if (
preg_last_error() == PREG_BAD_UTF8_ERROR) {
    print
'Bad UTF8 error!';
}
else if (
preg_last_error() == PREG_BAD_UTF8_ERROR) {
    print
'Bad UTF8 offset error!';
}
?>
johan at bluemoonit dot net 24-May-2010 02:20
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.