вложенные кавычки кода bb как ›

Привет, я использую довольно простой парсер bbcode.

не могли бы вы помочь мне с моей проблемой?

но когда, например, это написано:

[quote=tanab][quote=1][code]a img{
text-decoration: none;
}[/code][/quote][/quote]

вывод таков:

tanab said:
[quote=1]
a img{
    text-decoration: none;
}
[/quote] 

как бы я пошел и исправить это? Я действительно плохо разбираюсь во всей этой штуке preg_replace.

это мой парсер:

function bbcode($input){
$input = htmlentities($input);

$search = array(
            '/\[b\](.*?)\[\/b\]/is',
            '/\[i\](.*?)\[\/i\]/is',
            '/\[img\](.*?)\[\/img\]/is',
            '/\[url=(.*?)\](.*?)\[\/url\]/is',
            '/\[code\](.*?)\[\/code\]/is',
            '/\[\*\](.*?)/is',
            '/\\t(.*?)/is',
            '/\[quote=(.*?)\](.*?)\[\/quote\]/is',
);

$replace = array(
            '<b>$1</b>',
            '<i>$1</i>',
            '<img src="$1">',
            '<a href="$1">$2</a>',
            '<div class="code">$1</div>',
            '<ul><li>$1</li></ul>',
            '&nbsp;&nbsp;&nbsp;&nbsp;',
            '<div class="quote"><div class="quote-writer">$1 said:</div><div class="quote-body">$2</div></div>',

);

return preg_replace($search,$replace,$input);

}


person sn0ep    schedule 26.08.2011    source источник
comment
Могу ли я предложить вам, ради любви к Богу, не использовать BBC-код?   -  person NullUserException    schedule 26.08.2011
comment
Что вы пытаетесь исправить? В чем проблема?   -  person afuzzyllama    schedule 26.08.2011
comment
возможный дубликат вложенных кодов bb не будет делать то, что я хочу   -  person mario    schedule 26.08.2011


Ответы (1)


Это можно адаптировать с помощью рекурсивного регулярного выражения:

 '/\[quote=(.*?)\](((?R)|.*?)+)\[\/quote\]/is'

Что, по крайней мере, гарантирует, что выходные div не будут неправильно вложены. Но вам все равно придется запускать регулярное выражение дважды или трижды, чтобы поймать все блоки кавычек.

В противном случае потребуется переписать код с помощью preg_replace_callback. Которую я не буду утруждать себя демонстрацией, так как это уже встречалось несколько десятков раз (попробуйте поиск по сайту!), уже было решено раньше и т. д.

person mario    schedule 26.08.2011