我正在编写一个PHP脚本,它接受来自用户的正则表达式模式,由preg_match()使用。如何检查模式是否有效?
答案 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)
答案 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)
答案 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;
}
答案 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;
}