Я пишу этот ответ, потому что наткнулся на ту же проблему.Как указал Алан Мур , настройка пределов возврата и рекурсии не поможет решить проблему.
Описанная ошибка возникает, когда игла превышает максимально возможный размер иглы, который ограниченбазовой библиотекой pcre.Описанная ошибка NOT вызвана php, но основной библиотекой pcre.Это сообщение об ошибке № 20, которое определено здесь:
https://github.com/php/.../pcre_compile.c#L477
php просто печатает текст ошибки, полученный из библиотеки pcre при ошибке.
Однако эта ошибкапоявляется в моей среде, когда я пытаюсь использовать ранее захваченные фрагменты в качестве иглы, и они имеют размер больше 32 Кбайт.
Это можно легко проверить с помощью этого простого скрипта из cli php
<?php
// This script demonstrates the above error and dumps an info
// when the needle is too long or with 64k iterations.
$expand=$needle="_^b_";
while( ! preg_match( $needle, "Stack Exchange Demo Text" ) )
{
// Die after 64 kbytes of accumulated chunk needle
// Adjust to 32k for a better illustration
if ( strlen($expand) > 1024*64 ) die();
if ( $expand == "_^b_" ) $expand = "";
$expand .= "a";
$needle = '_^'.$needle.'_ism';
echo strlen($needle)."\n";
}
?>
Чтобы исправить ошибку, нужно уменьшить результирующую иглу или - если необходимо захватить все - использовать несколько preg_match с дополнительным параметром offset .
<?php
if (
preg_match(
'/'.preg_quote(
substr( $big_chunk, 0, 20*1024 ) // 1st 20k chars
)
.'.*?'.
preg_quote(
substr( $big_chunk, -5 ) // last 5
)
.'/',
$subject
)
) {
// do stuff
}
// The match all needles in text attempt
if ( preg_match(
$needle_of_1st_32kbytes_chunk,
$subj, $matches, $flags = 0,
$offset = 320 // Offset -> 0
)
&& preg_match(
$needle_of_2nd_32kbytes_chunk,
$subj, $matches, $flags = 0,
$offset = 32*1024*1 // Offset -> 32k
)
// && ... as many preg matches as needed
) {
// do stuff
}
// it would be nicer to put the texts in a foreach-loop iterating
// over the existings chunks
?>
Вы поняли. *1024*
Несмотря на то, что этот ответ является своего рода laaaaate, я надеюсь, что он по-прежнему помогает людям, столкнувшимся с этой проблемой, без четкого объяснения, почему возникает ошибка.