• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • preg_last_error()

    (PHP 5 >= 5.2.0, PHP 7)

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

    说明

    preg_last_error(void): int

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

    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 起)
    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()];
    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;
    }
    ?>
    
    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());
    ?>
    
    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.
    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"
    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()];
    If you use T-Regx library, to get the last constant, you can use
    <?php
    echo preg_last_error_constant(); // 'PREG_BAD_UTF8_ERROR'
    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()];

    上篇:preg_grep()

    下篇:preg_match_all()