preg_match_all不适用于所有php 7版本

时间:2018-09-24 17:59:49

标签: php php-7 preg-match-all

我的开发环境和生产环境没有完全相同的版本

我的开发环境:PHP 7.0.31-1 + ubuntu14.04.1 + deb.sury.org + 1(cli)

我的产品环境:PHP 7.0.30(cli)

对于完全相同的文本,此正则表达式

preg_match_all('/%occupancies%((?!%endoccupancies%).|\n)*%endoccupancies%/', $text, $matches);

在我的开发环境中找到匹配项,但在prod中找不到

简单代码:

http://sandbox.onlinephpfunctions.com/code/b4541decc65089269f6aae0e4392dc9081c14615

有没有一种方法可以解决此问题而无需升级我的php版本?

1 个答案:

答案 0 :(得分:0)

您的模式包含((?!%endoccupancies%).|\n)*替代组,该替代组与不以%endoccupancies%子字符串开头的换行符或换行符不匹配的char匹配(因此,它不匹配CRLF结尾) )。用*对该组进行量化,这意味着与该组匹配的每个字符都保存在组1的存储槽中,并在每次捕获一个字符时都被重写。这给PCRE引擎带来了巨大的开销。

使用[^%]*(?:%(?!endoccupancies%)[^%]*)*模式重写该部分。符合条件:

  • [^%]*-除%以外的0多个字符
  • (?:%(?!endoccupancies%)[^%]*)*-0次或多次出现
    • %(?!endoccupancies%)-一个%之后没有紧跟endoccupancies%
    • [^%]*-除%以外的0多个字符