Ваш шаблон содержит ((?!%endoccupancies%).|\n)*
группу чередования, которая соответствует либо символу, отличному от символа разрыва строки, который не запускает подстроку %endoccupancies%
, ни символу новой строки (так, например, он не совпадает с окончаниями CRLF).Эта группа количественно определяется с помощью *
, и это означает, что каждый символ, соответствующий этой группе, сохраняется в слоте памяти группы 1 и перезаписывается при каждом захвате символа.Это создает огромные накладные расходы для механизма PCRE.
Переписать эту часть с шаблоном [^%]*(?:%(?!endoccupancies%)[^%]*)*
.Он соответствует:
[^%]*
- 0+ символов, отличных от %
(?:%(?!endoccupancies%)[^%]*)*
- 0 или более вхождений %(?!endoccupancies%)
- a%
сразу не сопровождается endoccupancies%
[^%]*
- 0+ символов, отличных от %