Php 对分支重置组的反向引用

Php 对分支重置组的反向引用,php,regex,pcre,php-7,php-5.6,Php,Regex,Pcre,Php 7,Php 5.6,免责声明:如果不重置组,我不需要另一个更好的正则表达式。我需要理解为什么php5和php7的输出不同 问题:我试图使用一个分支重置组来匹配使用PHP的字符串,该字符串由不同分隔符分隔的数字组组成 $string = '12-34-56-78'; $pattern = '/^\d{2}(?|(---)|(-)|(\.)|(\:))\d{2}\1\d{2}\1\d{2}$/'; $matches = preg_match($pattern, $string) === 1; var_dump($mat

免责声明:如果不重置组,我不需要另一个更好的正则表达式。我需要理解为什么
php5
php7
的输出不同

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

$string = '12-34-56-78';
$pattern = '/^\d{2}(?|(---)|(-)|(\.)|(\:))\d{2}\1\d{2}\1\d{2}$/';
$matches = preg_match($pattern, $string) === 1;
var_dump($matches);
不幸的是,对于
PHP<7
。我还检查了libpcre的版本,它不是问题的根源。同一版本的
libpcre
为不同的
PHP
版本返回不同的结果

我找不到任何关于
PHP7
中更改的内容和原因的参考

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


Update:似乎是一个。

您确定
preg\u match
返回0而不是FALSE吗

编辑

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

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

编辑2

对于PHP7,似乎只有第一个子模式起作用。正则表达式也将是falsy,代码如下:

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

可能是PCRE错误,因为branch reset synatx在我看来是正确的。

此处不需要任何分支重置,因为您需要参考整个组的值。每一个版本都只有一个版本。@WiktorStribiżew再次感谢您。我知道我可以使用另一个
regex
。但这不是我要问的。我想我们可以把它简化为
$string='--'$模式='/^(?|(-)|(\1)/'并观察相同的行为。整个复制组功能在PHP7中不起作用,
'/(?J)^\d{2}(?)(?-)|(?-)|(?\)(?:)\d{2}\g{f}\d{2}\g{f}\d{2}$/'
也不起作用。这不是更依赖于绑定的
libpcre
//x
放得更宽敞些吗?为了装饰的目的?但它不是POSIX,是PCRE。我错了。变了,问得好。我已经检查过了,是的,它返回
0
。还更新了指向代码段的链接。反转
(-)
(-)
解决了问题,但我仍然不知道为什么^^接得好。这可能是一个bug。