Неупорядоченные элементы bbcode

Я немного закодировал preg в php, чтобы я мог сам написать несколько bbcode.

Поначалу все работало нормально, но я обнаружил, что когда я делаю что-то вроде [b]Stuff stuff [b]and more stuff[/b][/b], он выводит что-то вроде Материалы [b]и многое другое[/b]

поскольку я не могу сделать это, это заставить его сначала найти последний из всех близких тегов с помощью [b][/b] в основном для устранения этой проблемы, но, похоже, у меня ничего не работает.

коды работают так

$bbcode = "[b]Stuff stuff [b]and more stuff[/b][/b]";
$bb[] = "#\[b\](.*?)\[/b\]#i";
$html[] = "<b>\\1</b>";
$bbcode = preg_replace($bb, $html, $bbcode);
return $bbcode;

Я попытался заставить его выводить что-то вроде Материалы и многое другое, сделав еще одну строку, например

$bbcode = "[b]Stuff stuff [b]and more stuff[/b][/b]";
$bb[] = "#\[b\]#i";
$html[] = "<b>";
$bb[] = "#\[/b\]#i";
$html[] = "</b>";
$bbcode = preg_replace($bb, $html, $bbcode);
return $bbcode;

Но это не останавливает выполнение чего-либо, что является тупиковым тегом, таким как дополнительный [/b].
Любые идеи о том, как заставить его найти первый [b] и последний [/b] без столкновения с другими новые открытые теги, которые открываются после?


person do0l67    schedule 17.02.2013    source источник
comment
Первый дает вам <b>Stuff stuff <b>and more stuff</b></b>, разве этого недостаточно?   -  person Breaking not so bad    schedule 17.02.2013
comment
нет, он берет [b] из первого и сопоставляет [/b] для первого, по-видимому, он игнорирует второй [b] из-за этого...   -  person do0l67    schedule 18.02.2013


Ответы (1)


Для этого конкретного случая замены bbcode простой способ — заменить [b] на <b> и [/b] на </b>, не пытаясь понять, что внутри.

С помощью str_ireplace:

$source = str_ireplace(array('[b]', '[/b]'), array('<b>', '</b>'), $source);

или с preg_replace:

$source = preg_replace('~\[(/?b)]~i', '<$1>', $source);
person Casimir et Hippolyte    schedule 23.07.2013