Php 如何捕获无效的preg_匹配模式?
我正在编写一个PHP脚本,它接受preg_match()使用的用户的正则表达式模式。如何检查模式是否有效?只需测试即可。 如果模式无效,将返回Php 如何捕获无效的preg_匹配模式?,php,regex,preg-match,Php,Regex,Preg Match,我正在编写一个PHP脚本,它接受preg_match()使用的用户的正则表达式模式。如何检查模式是否有效?只需测试即可。 如果模式无效,将返回FALSE 返回值:preg_match()返回 模式匹配的次数。 这将是0次(不匹配) 或1次,因为preg_match()将 第一次匹配后停止搜索。 相反,preg_match_all()将 继续,直到到达终点 主题preg_match()在以下情况下返回FALSE 出现错误。 据报道, 如果发生错误,preg_match()将返回FALSE 问题是它
FALSE
返回值:preg_match()返回
模式匹配的次数。
这将是0次(不匹配)
或1次,因为preg_match()将
第一次匹配后停止搜索。
相反,preg_match_all()将
继续,直到到达终点
主题preg_match()在以下情况下返回FALSE
出现错误。
据报道,
如果发生错误,preg_match()将返回FALSE
问题是它也会发出警告
处理此问题的一种方法是抑制错误消息的输出,捕获返回值,如果错误为false,则使用error\u get\u 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
在生产环境中,您可能不需要错误报告位—这取决于您的设置。我想我已经在中看到了一种用于此的方法;原来是弗里德自己写的。以下是。您可以使用preg\u last\u error()获取响应。详情页:
if (preg_match($regex, $variable)) {
echo 'Valid';
}
else {
echo 'InValid';
}
谢谢 一个简单的解决方案是用“@”抑制警告,然后检查错误:
@preg_match($match, $ip);
if ( preg_last_error() != PREG_NO_ERROR ) {
echo("<p>Syntax error in regular expression ".htmlentities($match)."</p>\n");
}
@preg_match($match,$ip);
if(preg\u last\u error()!=preg\u NO\u error){
echo(“正则表达式中的语法错误”.htmlentities($match)。”\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;
}
您必须使用preg_match(…)==false检查它,因为如果它有效但不匹配,它可以返回0。您应该将其与false进行比较:
如果(preg_match($regex,$variable)!==false){
。该模式可以是有效的,没有匹配项。您知道,使用@
:p应该是如果($match==false)
@事实上是真的,但它看起来太难看了!:)@webbiedave欢呼着,更正了。这有什么用吗?用preg\u match\u all()
(它肯定返回false
)来尝试它,但它只是返回null
(我知道它在没有错误的情况下是这样做的).@Adam我想应该。你确定你给它喂的是一个有缺陷的正则表达式?奇怪。