membrilius
Новичок
Доброго времени суток!
У меня есть простой парсер BB кодов, работает с использованием рекурсивных шаблонов.
Урезанная версия для примера:
Работа:
Как видите, рекурсивный шаблон помогает обрабатывать вложенные теги. (Куча вложенные "<B>" для примера. Корректная обработка вложенности нужна для более сложный тегов)
Вся беда в том, что если в теги заключать большой кусок текста, то скрипт завершается крахом.
В Windows версии PHP я могу захватить примерно 250 символов с большой вложенностью.
В Linux версии около 10 000 символов.
Далее скрипт умирает. Как я понимаю дело в ограниченном числе рекурсий. Но причем тут число символов?
Почему 50 вложенных тегов b в маленьком тексте это нормально. А просто текст оформленных одним тегом но состоящий из 10 000 символов приводит к краху?
У меня есть простой парсер BB кодов, работает с использованием рекурсивных шаблонов.
Урезанная версия для примера:
PHP:
class bb
{
public $excluded_tags = array(); // запрещённые теги
//-------------------------------------------------------------------------
public function parse($text)
{
$text = trim($text);
$text = $this->parse_tag_b_find($text);
$text = str_replace("\r" , "", $text);
$text = str_replace("\n", "<br>", $text);
return $text;
}
//-------------------------------------------------------------------------
private function parse_tag_b_find($text)
{
if( ! in_array("b", $this->excluded_tags)) {
$result = preg_replace_callback("#(?:\[(b)\])(?P<text>(?:(?:(?!\[/?\\1\]).)*|(?R))*)(?:\[/\\1\])#is", array($this, 'parse_tag_b_build'), $text);
}
else {
$result = null;
}
return (is_string($result)) ? $result : $text;
}
//-------------------------------------------------------------------------
private function parse_tag_b_build($match)
{
return "<b>".$this->parse_tag_b_find($match['text'])."</b>";
}
}
PHP:
$bb = new bb();
$text = "[b]«Князь Андрей встал и [b]подошел к [b]окну, чтобы[/b] отворить его.[/b] Как только он открыл ставни, лунный свет, как будто он настороже у окна давно ждал этого, ворвался в комнату.[/b]";
echo $bb->parse($text);
Вся беда в том, что если в теги заключать большой кусок текста, то скрипт завершается крахом.
В Windows версии PHP я могу захватить примерно 250 символов с большой вложенностью.
В Linux версии около 10 000 символов.
Далее скрипт умирает. Как я понимаю дело в ограниченном числе рекурсий. Но причем тут число символов?
Почему 50 вложенных тегов b в маленьком тексте это нормально. А просто текст оформленных одним тегом но состоящий из 10 000 символов приводит к краху?