【问题标题】:PHP 7 regex not working the same way as in 5PHP 7 正则表达式的工作方式与 5 不同
【发布时间】:2017-01-14 18:48:47
【问题描述】:

所以我必须使用 php 7,并且我有以下正则表达式,它在 5.5 和 5.6 中工作得很好。

([\\'\\\"].*[\\'\\\"])([\\s]*[\\s]*=>[\\s]*[\\s])(\\[([^\\[\\]]|(?R))*[\\s]*[\\s]\\])/m

当我使用 preg_match_all 在 5 的任何版本中运行它时,我得到了正确的结果。基本上我正在尝试匹配表单文本文件中的数组

'key' => [
   'val1 => 'sdsd',
   'val2' => '3e3',  
]

上面的表达式选择了这个数组。在 PHP 7(7.0.8 和 7.0.9)中,不会返回任何匹配项。

任何人对我们为什么以及如何将表达式移植到 7 有任何想法?

编辑:

使用的代码

can be found in this gist

奇怪的是,它确实适用于某些版本的 php 7。例如,我的虚拟机正在运行

PHP 7.0.9-1+deb.sury.org~trusty+1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.9-1+deb.sury.org~trusty+1, Copyright (c) 1999-2016,        by Zend Technologies

它工作正常,另一方面,生产服务器运行

PHP 7.0.9 (cli) (built: Jul 22 2016 11:36:32) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.9, Copyright (c) 1999-2016, by Zend Technologies

它根本不起作用。 $matches 无论如何都是空的。在我正在使用的另一个 ubuntu 桌面上也是如此。它也不适用于 Windows 使用

PHP 7.0.9 (cli) (built: Jul 20 2016 10:47:41) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

它适用于使用各种 5.x 版本的所有机器

【问题讨论】:

  • 连续三个反斜杠?
  • 仅供参考:对于正则表达式引擎,您不需要转义 '",对于 PHP 引擎只需转义一次。
  • 工作php7 php5。你能分享你的代码吗?
  • @ThomasAyoub 它的行为与我的行为相同。如果您检查我编辑的问题,我有一个它不起作用的 php 版本列表。你的也一样。它可以在 VM 上运行,但生产和 windows 并不快乐,它返回时是空的。

标签: php regex preg-match-all


【解决方案1】:

我可以使用这个正则表达式(匹配项与您的要求相同):

$matchArray = '~([\'"][^\'"]*[\'"])(\s*=>\s+)(\[(?:[^\[\]])*\s+\])~m';

代替你的:

$matchArray = '~([\'"].*[\'"])([\s]*[\s]*=>[\s]*[\s])(\[([^\[\]]|(?R))*[\s]*[\s]\])~m';

参见buggy versionworking version

说这是由于一些超时更改,但我找不到任何关于此的虔诚信息。

【讨论】:

  • 是的,这很好用。我刚才想出了一个类似的解决方案,但它不适用于 Windows 版本的 PHP。不过,找出这是怎么回事会很有趣。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 2012-09-01
  • 2010-09-12
  • 2020-09-13
  • 2017-12-18
相关资源
最近更新 更多