如何捕获无效的preg_match模式?

时间:2010-09-14 15:39:34

标签: php regex preg-match

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

8 个答案:

答案 0 :(得分:8)

根据docs

  

如果发生错误,preg_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

您可能不需要生产环境中的错误报告位 - 这取决于您的设置。

答案 1 :(得分:5)

试试吧。 如果模式无效,preg_match()将返回FALSE

  

返回值:preg_match()返回   模式匹配的次数。   那将是0次(不匹配)   或者1次因为preg_match()会   在第一场比赛后停止搜索。   preg_match_all()恰恰相反   继续,直到它结束   学科。 preg_match()如果返回FALSE   发生错误。

答案 2 :(得分:1)

您可以使用preg_last_error()来获取响应。详情页面:

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

谢谢!

答案 3 :(得分:1)

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

@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 -是否只需要检查正则表达式的语法就没关系。

答案 4 :(得分:0)

if (preg_match($regex, $variable)) {
    echo 'Valid';
}
else {
    echo 'InValid';
}

答案 5 :(得分:0)

我以为我在MRE看到了一种方法。原来这是弗里德写的一个人。这是listing

答案 6 :(得分:0)

自从首次提出(并回答)这个问题以来,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)

不要使用@,在preg_match前面使用反斜杠在新版本的PHP中抛出异常(5.3+?)。

tr{
   if (\preg_match($regex, $variable)===false)
      echo 'Valid';
   else
      echo 'InValid';
}
catch(Exception $e) {
   echo $e->getMessage(); die;
}