能否从 preg_match 中捕获任何错误并显示常见错误消息?

7
我有一个网站,其中包含一个搜索框,允许用户输入一个模式,然后检查大字符串,以查看用户指定的模式是否有匹配项。这是使用PHP函数preg_match()完成的。
但是,当用户输入无效模式时(例如导致错误的模式),问题就会出现,如: preg_match() [function.preg-match]: Unknown modifier.
搜索功能需要能够处理preg_match()方法抛出的任何错误,并在屏幕上显示通用模式无效消息。我在网上找了很久,但找不到一种捕捉preg_match()可能抛出的所有错误的方法,你们有什么想法吗?

preg函数不会抛出异常... - Marc B
1
set_error_handler()和抛弃... - AbraCadaver
@AbraCadaver 我是想到提供自己的修饰符,而不是让用户提供它,然后只引用他们提供的任何字符串,但再次阅读问题,这可能行不通,除非你想允许有限的搜索功能。 - Mike
1
参见:https://dev59.com/-m855IYBdhLWcg3wQyDh - Mike
1
那是一个好的回答,但我认为最好显示具体错误,而不仅仅抑制并声明“有错误”。 - AbraCadaver
显示剩余4条评论
3个回答

5

3

举个简单的例子,设置一个错误处理器并抛出一个ExceptionErrorException

function exception_error_handler($severity, $message, $file, $line) {
    throw new ErrorException($message, 0, $severity, $file, $line);
}
set_error_handler("exception_error_handler");

那么尝试使用try/catch:

try {
    preg_match('/.*/hello', 'hello');
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

捕获异常:preg_match():未知修饰符'h'


不幸的是,并非所有的正则表达式错误都可以通过这种方式捕获。例如,我的项目中源字符串的无效字符编码使得 preg_match_all 静默地返回了 false。(preg_last_error 报告了 PREG_BAD_UTF8_ERROR,但从未引发任何异常。我使用了一个未知的修饰符进行了双重检查,它已经愉快地抛出了异常。) - Sz.

0

自 PHP 8 开始,您还可以使用 preg_last_error_msg() 获取人类可读的错误消息,例如:

if (preg_last_error() !== PREG_NO_ERROR) {
    throw new Exception(preg_last_error_msg());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接