代码之家  ›  专栏  ›  技术社区  ›  Liam

如何捕捉无效的preg\u匹配模式?

  •  8
  • Liam  · 技术社区  · 14 年前

    我正在编写一个PHP脚本,它接受preg\u match()使用的用户的正则表达式模式。如何检查模式是否有效?

    6 回复  |  直到 14 年前
        1
  •  5
  •   Amal Murali    10 年前

    测试一下。 preg_match() 会回来的 FALSE 如果模式无效。

    返回值:preg\u match()返回 模式匹配的次数。 将是0次(不匹配) 或1次,因为preg\u match()将 preg\u match\u all()则相反 主题。

        2
  •  9
  •   Pekka    14 年前

    根据 docs

    如果发生错误,preg\u match()返回FALSE。

    处理这种情况的一种方法是抑制错误消息的输出,捕获返回值,然后使用 error_get_last() 如果是假的。

    像这样的

    $old_error = error_reporting(0); // Turn off error reporting
    
    $match = preg_match(......);
    
    if ($match === false) 
     {
       $error = error_get_last();
       echo $error["message"];
     }
    
    error_reporting($old_error);  // Set error reporting to old level
    

        3
  •  2
  •   Vijay    8 年前

    您可以使用preg\u last\u error()获取响应。详细页:

    http://php.net/manual/en/function.preg-last-error.php

        4
  •  1
  •   drchuck    4 年前

    一个简单的解决方案是用“@”抑制警告,然后检查错误:

    @preg_match($match, $ip);
    if ( preg_last_error() != PREG_NO_ERROR ) {
       echo("<p>Syntax error in regular expression ".htmlentities($match)."</p>\n");
    }
    

    $ip 在这种情况下)和 preg_match 返回值-不管您是否只想检查正则表达式的语法。

        5
  •  0
  •   Alan Moore Chris Ballance    14 年前

    MRE 原来是弗里德尔自己写的。这是你的答案 listing .

        6
  •  0
  •   dearsina    4 年前

    自从这个问题第一次被提出(并得到回答)以来,PHP已经取得了相当大的进步。由于PHP 5.2可以简单地编写以下内容,不仅可以测试正则表达式是否有效,还可以在不有效时获取详细的错误消息:

    if(@preg_match($pattern, '') === false){
       echo error_get_last()["message"];
    }
    

    置于函数中

    /**
     * Return an error message if the given pattern argument or its underlying regular expression
     * are not syntactically valid. Otherwise (if they are valid), NULL is returned.
     *
     * @param $pattern
     *
     * @return string|null
     */
    function regexHasErrors($pattern): ?string
    {
        if(@preg_match($pattern, '') === false){
            return str_replace("preg_match(): ", "", error_get_last()["message"]);
            //Make it prettier by removing the function name prefix
        }
        return NULL;
    }
    

    Demo

        7
  •  -1
  •   Alex Pliutau    14 年前
    if (preg_match($regex, $variable)) {
        echo 'Valid';
    }
    else {
        echo 'InValid';
    }