对分支重置组的反向引用

A backreference to a branch reset group

免责声明:我不需要另一个 更好 没有重置组的正则表达式。我需要了解为什么 PHP 5PHP 7.

的输出不同

问题:我尝试使用分支重置组来匹配使用 PHP 的字符串,该字符串由不同分隔符分隔的数字组组成。

$string = '12-34-56-78';
$pattern = '/^\d{2}(?|(---)|(-)|(\.)|(\:))\d{2}\d{2}\d{2}$/';
$matches = preg_match($pattern, $string) === 1;
var_dump($matches);

不幸的是 it works only PHP < 7。我还检查了 libpcre 的版本,这不是问题的根源。同一个版本libpcrereturns不同PHP版本结果不同

我找不到任何关于 PHP 7 中更改内容和更改原因的参考资料。

问题:为什么PHP 5PHP 7的输出不同?这是 PHP 7 的预期行为吗?

更新: 好像是bug.

您确定 preg_match returns 0 而不是 FALSE 吗?

编辑

仍然不知道为什么,但反转 (-)(---) 解决了问题:

/^\d{2}(?|(-)|(---)|(\.)|(\:))\d{2}\d{2}\d{2}$/

Demo

编辑 2

对于 PHP 7,似乎只有第一个子模式有效。正则表达式也将使用以下代码伪造:

$string = '12.34.56.78'; 
$string = '12:34:56:78'; 
$string = '12---34---56---78'; 

可能是 PCRE 错误,因为分支重置语法对我来说似乎是正确的。

这是一个 bug 并且已修复。