【发布时间】:2017-10-18 08:00:09
【问题描述】:
免责声明:我不需要另一个没有重置组的更好正则表达式。我需要了解为什么 PHP 5 和 PHP 7 的输出不同。
问题:我尝试使用分支重置组来匹配使用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);
不幸的是it works only 为PHP < 7。我还检查了libpcre 的版本,这不是问题的根源。 libpcre 的相同版本对于不同的PHP 版本返回不同的结果。
我找不到任何关于 PHP 7 中更改的内容和原因的参考。
问题:为什么PHP 5 和PHP 7 的输出不同?这是PHP 7 的预期行为吗?
更新:好像是bug。
【问题讨论】:
-
这里不需要任何分支重置,因为你需要引用整个组的值。只需
^\d{2}(---|[-.:])\d{2}\1\d{2}\1\d{2}$即可在每个版本中使用。 -
@WiktorStribiżew 再次感谢您。我知道我可以使用另一个
regex。但这不是我要问的。 -
我认为我们可以将其减少到
$string = '--'; $pattern = '/^(?|(---)|(-)\1)/';并观察相同的行为。 -
整个复制组功能在 PHP 7 中不起作用,
'/(?J)^\d{2}(?|(?<f>---)|(?<f>-)|(?<f>\.)|(?<f>:))\d{2}\g{f}\d{2}\g{f}\d{2}$/'也不起作用。 -
这不会比 PHP 运行时更多地依赖于绑定的
libpcre/PCRE_VERSION吗? -- 你也可以在这里让正则表达式/x更宽敞 - 用于装饰目的吗?
标签: php regex pcre php-7 php-5.6