奇怪的不可接受的PHP Regex模式


Strange Unaccepted PHP Regex Pattern

因此,在尝试bug修复意外错误的过程中,我得出的结论是,以下内容在php中是不可接受的:

$pattern = "/'/sc2'/en'/profile'/693604'/1'/EGIdrA'/ladder'/";
$subject = "'/sc2'/en'/profile'/693604'/1'/EGIdrA'/ladder'/";
preg_match($pattern, $subject, $result);

我不知道是怎么做的,也不知道为什么——我只知道,如果我有这行,那么在这行之前和之后的不同位置,不同单词的各种调试回声就不再回声了。任何地方都没有循环,所以我很困惑为什么这会导致问题。

字符串中不需要转义斜杠。''/''''/'相同,即字符串'/

在正则表达式中,如果使用斜线终止表达式,'/将转义斜线。您不需要,只需选择另一个终止符,如#:

preg_match('#^/sc2/en/profile/693604/1/EGIdrA/ladder/$#',
           '/sc2/en/profile/693604/1/EGIdrA/ladder/', $result);

preg_match的单个调用不会停止程序的执行。然而,可能会发出各种错误和警告——例如,在生成的正则表达式中缺少一个终止的/

PHP Warning:  preg_match(): No ending delimiter '/' found

检查服务器的php设置(即error_reporting和log_errors)是否有警告和错误输出配置。在许多系统上,/var/log/apache*/error.log包含所有php错误和警告。请注意,设置display_errors可能会修改输出,使其成为无效的XML文档或混淆高级输出缓冲。

原因如下:

preg_match('/^'/$/', ''/'); // false
preg_match('/^'/$/', '/'); // true

您不应该在输入字符串中转义斜杠/,在模式中转义它们就足够了

preg_match('/^'/sc2'/en'/profile'/693604'/1'/EGIdrA'/ladder'/$/',
       '/sc2/en/profile/693604/1/EGIdrA/ladder/', $result);

(或者像前面提到的phihag一样,使用#作为模式终止)