【问题标题】:A backreference to a branch reset group对分支重置组的反向引用
【发布时间】:2017-10-18 08:00:09
【问题描述】:

免责声明:我不需要另一个没有重置组的更好正则表达式。我需要了解为什么 PHP 5PHP 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 onlyPHP < 7。我还检查了libpcre 的版本,这不是问题的根源。 libpcre 的相同版本对于不同的PHP 版本返回不同的结果。

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

问题:为什么PHP 5PHP 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


【解决方案1】:

您确定 preg_match 返回 0 而不是 FALSE 吗?

编辑

仍然不知道为什么,但将(-)(---) 颠倒即可解决问题:

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

Demo

编辑 2

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

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

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

【讨论】:

  • 但这不是 POSIX,而是 PCRE。
  • 我的错误。改变了。
  • 好问题。我已经检查过了,是的,它返回0。也更新了 sn-p 的链接。
  • 反转 (-)(---) 解决了问题,但我仍然不知道为什么... ^^
  • 不错的收获。这可能是一个错误。
【解决方案2】:

这是一个bug,它已被修复。

【讨论】:

    猜你喜欢
    • 2013-09-23
    • 1970-01-01
    • 2022-01-21
    • 2014-01-12
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多