Еще один классический случай катастрофического возврата . Должен быть мой счастливый день сегодня.
/\{(([^{}]*|(?R))*)\}/
соответствует, только если фигурные скобки правильно вложены. Которого, конечно, нет в твоей строке.
Теперь проблема в том, что вашему регулярному выражению необходимо выяснить все возможные комбинации строк, которые вы можете построить с помощью 106 a
s, чтобы выяснить это, потому что у вас есть вложенные квантификаторы ((...)*)*)
. Который (поправьте меня, если я ошибаюсь) должен быть где-то около 106!
, что доходит до
114628056373470835453434738414834942870388487424139673389282723476762012382449946252660360871841673476016298287096435143747350528228224302506311680000000000000000000000000
, который легко превосходит ваш PREG_BACKTRACK_LIMIT.
Если вы используете собственнические квантификаторы , чтобы убедиться, что вы никогда не вернетесь к уже не сопоставленным фигурным скобкам, тогда у вас должно быть все в порядке:
/\{(([^{}]*+|(?R))*)\}/