PHP正则表达式不工作,尽管在正则表达式101中成功匹配
我遇到了最奇怪的问题。我试着在这里引用其他类似的答案,但似乎没有一个能解决我的问题 我在PHP中有以下正则表达式PHP正则表达式不工作,尽管在正则表达式101中成功匹配,php,regex,pcre,Php,Regex,Pcre,我遇到了最奇怪的问题。我试着在这里引用其他类似的答案,但似乎没有一个能解决我的问题 我在PHP中有以下正则表达式 /if\s+(?:(.*?)\s*=\s*(?:UrlStatus | DeadURL)在数组中(?:UrlStatus | DeadURL),\s*(.*?)\s*然后\s+本地\s+拱形文本\s+=\s+cfg.messages\['archive'];(?:(?:\n |。)*?如果\s+(?:(.*?)\s*==\s*(?:UrlStatus | DeadURL)|在数组中\
/if\s+(?:(.*?)\s*=\s*(?:UrlStatus | DeadURL)在数组中(?:UrlStatus | DeadURL),\s*(.*?)\s*然后\s+本地\s+拱形文本\s+=\s+cfg.messages\['archive'];(?:(?:\n |。)*?如果\s+(?:(.*?)\s*==\s*(?:UrlStatus | DeadURL)|在数组中\s*(?:UrlStatus | DeadURL),\s*(.*?\s*)\s*那么\s+存档=sepc\)?/im
我知道这是一个混乱的正则表达式,它应该解析来自不同位置的不同版本模块的代码。它在regex101中工作得很好,但preg_match返回false,表示发生了错误。您看到的正则表达式直接从var_转储中提取。从var_转储中还提取了正在测试的字符串。我在下面附上了应该与之匹配的摘录
if is_set(ArchiveURL) then
if not is_set(ArchiveDate) then
ArchiveDate = seterror('archive_missing_date');
end
if "no" == DeadURL then
local arch_text = cfg.messages['archived'];
if sepc ~= "." then arch_text = arch_text:lower() end
Archived = sepc .. " " .. substitute( ```
In the full block of text it takes 81,095 steps to match.
Could it have something to do with that?
从preg_last_error()读取数据时,返回6,这映射到常量preg_JIT_STACKLIMIT_error
PHP7使用JIT编译器进行preg_匹配,堆栈大小限制较小。禁用它允许preg_match执行其工作
这可以在php.ini文件中完成,也可以在脚本中使用ini\u集('pcre.jit',false)动态完成代码>您是否查看了输出?您是否听说过我们的主和救世主,regex/x
可读性标志?@Nick it似乎返回PREG\u JIT\u STACKLIMIT\u错误。虽然我不知道如何修复它。@Cyberpower678在常量定义中有一个关于禁用JIT
的注释@Nick Stackoverflow是一个美丽的地方$old=ini_集('pcre.jit',false);做了这个把戏,现在它匹配了D