我正在编写一个PHP脚本,该脚本接受用户输入的正则表达式模式,并将其用于preg_match()函数。如何检查该模式是否有效?
我正在编写一个PHP脚本,该脚本接受用户输入的正则表达式模式,并将其用于preg_match()函数。如何检查该模式是否有效?
$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
在生产环境中,您可能不需要错误报告位 - 这取决于您的设置。
仅仅是测试一下。
如果模式无效,preg_match()
将返回FALSE
。
返回值:preg_match()返回 模式匹配的次数。 这将是0次(没有匹配)或1次, 因为preg_match()在第一次匹配后停止搜索。 相反地,preg_match_all()会一直继续, 直到达到主题的末尾。如果发生错误,则preg_match()返回FALSE。
一个简单的解决方案是使用“@”来抑制警告,然后在之后检查错误:
@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
的返回值 - 如果您只想检查正则表达式的语法,则并不重要。自从这个问题被提出(并得到回答)以来,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;
}
if (preg_match($regex, $variable)) {
echo 'Valid';
}
else {
echo 'InValid';
}
@
并不是被禁止的 :p - Artefactopreg_match_all()
(肯定返回false
)来测试,但它只是返回null
(我知道当没有错误时它会这样做)。 - Adam Lynchpcre.backtrack_limit
上。我原以为不是回溯限制的问题,因为那一行被注释掉了,而取消注释并没有任何影响……但事实证明,将它加三个零就可以了;http://stackoverflow.com/questions/9121654/why-would-this-regex-return-an-error。这让我想知道,如果达到了限制,preg_match_all()为什么不会返回false呢? - Adam Lynch