PHP регулярное выражение не работает, несмотря на успешное сопоставление в регулярном выражении - PullRequest
1 голос
/ 08 ноября 2019

У меня самая странная проблема. Я попытался сослаться на другие подобные ответы здесь, но ни один из них, похоже, не решил мою проблему.

У меня есть следующее регулярное выражение в 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?

1 Ответ

0 голосов
/ 14 ноября 2019

Получив чтение из preg_last_error (), он вернул 6, что соответствует константе PREG_JIT_STACKLIMIT_ERROR.

PHP 7 использует JIT-компилятор для preg_match с небольшим ограничением размера стека. Отключение позволяет preg_match выполнять свою работу.

Это можно сделать в файле php.ini или на лету в скрипте с помощью ini_set( 'pcre.jit', false );

...