function recursiveSplit($string, $layer) { $err = preg_match_all("/\{(([^{}]*|(?R))*)\}/",$string,$matches); echo "Elementi trovati: $err<br>"; if($err == FALSE) echo "preg_match_all ERROR<br>"; // iterate thru matches and continue recursive split if (count($matches) > 1) { for ($i = 0; $i < count($matches[1]); $i++) { if (is_string($matches[1][$i])) { if (strlen($matches[1][$i]) > 0) { echo "<pre>Layer ".$layer.": ".$matches[1][$i]."</pre><br />"; recursiveSplit($matches[1][$i], $layer + 1); } } } } } $buffer = "{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{aaaaaaaaaaaaaaaaaa{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}"; recursiveSplit($buffer, 0);
вывод
Elementi trovati: preg_match_all ERROR Backtrack limit was exhausted!
этот код дает мне ошибку PREG_BACKTRACK_LIMIT_ERROR … но предел обратного пути равен 100.000.000.
Это мой первый раз с регулярным выражением, и я действительно не знаю, как его решить.
Большое спасибо, Марко
Еще один классический случай катастрофического отступления . Должно быть, сегодня мой счастливый день .
/\{(([^{}]*|(?R))*)\}/
только соответствует, если фигурные скобки правильно вложены. Которые они не являются, конечно, в вашей строке.
Теперь проблема заключается в том, что вашему регулярному выражению нужно выяснить все возможные комбинации строк, которые вы можете построить с помощью 106 a
с, чтобы понять это, потому что у вас есть вложенные кванторы ((...)*)*)
. Который (поправьте меня, если я ошибаюсь) должен быть где-то в районе 106!
который приходит
114628056373470835453434738414834942870388487424139673389282723476762012382449946252660360871841673476016298287096435143747350528228224302506311680000000000000000000000000
который легко бьет ваш PREG_BACKTRACK_LIMIT.
Если вы используете притяжательные квантификаторы, чтобы убедиться, что вы никогда не вернетесь в фигурные скобки, которые вы уже сопоставили, тогда вы должны быть в порядке:
/\{(([^{}]*+|(?R))*)\}/