Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何捕获无效的preg_匹配模式?_Php_Regex_Preg Match - Fatal编程技术网

Php 如何捕获无效的preg_匹配模式?

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 问题是它

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

只需测试即可。 如果模式无效,将返回
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我想应该。你确定你给它喂的是一个有缺陷的正则表达式?奇怪。