尽管已在regex101中成功匹配,但PHP regex无法正常工作

我遇到了最奇怪的问题。我尝试在这里引用其他类似的答案,但似乎都无法解决我的问题。

我在PHP中具有以下正则表达式

/if\s+(?:(.*?)\s*==\s*(?:UrlStatus|DeadURL)|in_array\s*\((?:UrlStatus|DeadURL),\s*(.*?)\s*\))\s*then\s+local\s+arch_text\s+=\s+cfg.messages\['archived'\];(?:(?:\n|.)*?if\s+(?:(.*?)\s*==\s*(?:UrlStatus|DeadURL)|in_array\s*\((?:UrlStatus|DeadURL),\s*(.*?)\s*\))\s*then\s+Archived = sepc \.\.)?/im

我知道这是一个凌乱的正则表达式,应该从不同位置的各种版本的模块中解析代码。它在regex101中可以正常工作,但是preg_match返回false,表示发生了错误。您看到的正则表达式直接从var_dump中拉出。还从var_dump中提取了正在测试的字符串。我在下面提供了应该与之匹配的摘录。

    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?
piaoliangdemeimei 回答:尽管已在regex101中成功匹配,但PHP regex无法正常工作

从preg_last_error()中读取数据,它返回6,它映射到常量PREG_JIT_STACKLIMIT_ERROR。

PHP 7使用JIT编译器进行preg_match,且堆栈大小限制很小。禁用它可以使preg_match发挥作用。

这可以在php.ini文件中完成,也可以通过使用ini_set( 'pcre.jit',false );在脚本中动态完成

本文链接:https://www.f2er.com/3140794.html

大家都在问