我的开发环境和生产环境没有完全相同的版本
我的开发环境: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版本?
答案 0 :(得分:0)
您的模式包含((?!%endoccupancies%).|\n)*
替代组,该替代组与不以%endoccupancies%
子字符串开头的换行符或换行符不匹配的char匹配(因此,它不匹配CRLF结尾) )。用*
对该组进行量化,这意味着与该组匹配的每个字符都保存在组1的存储槽中,并在每次捕获一个字符时都被重写。这给PCRE引擎带来了巨大的开销。
使用[^%]*(?:%(?!endoccupancies%)[^%]*)*
模式重写该部分。符合条件:
[^%]*
-除%
以外的0多个字符(?:%(?!endoccupancies%)[^%]*)*
-0次或多次出现
%(?!endoccupancies%)
-一个%
之后没有紧跟endoccupancies%
[^%]*
-除%
以外的0多个字符