0

i'm making my own bbcode parser, and i've a problem when i try to do the recursive quote.

this is my code :

 function forumBBCode($str){
$format_search=array(
'#\[quote=(.*?)\](.*?)\[/quote\]#is'
);

$format_replace=array(
'<blockquote class="quotearea"><i><a class="lblackbu" href="./index.php?status=userview&userv=$1">$1</a> wrote :</i><br />$2</blockquote>'
);

$str=preg_replace($format_search, $format_replace, $str);
$str=nl2br($str);
return $str;
}

what i must add/edit to do a recursive quote? in other words, when a quote is inside another quote...

cheers and tnx for the help

chris85
  • 23,846
  • 7
  • 34
  • 51
markzzz
  • 47,390
  • 120
  • 299
  • 507
  • 1
    That's pretty difficult if you're new to regular expressions. Recursive regexes are tricky, so most people opt for the /e evaluation flag and actually have the regex "parser" descent into enclosed content. Anyway, first read through http://www.regular-expressions.info/ - it's a better introduction than the PHP manual. – mario Jul 09 '10 at 22:49
  • i'll learn this guide and i'll try to make a function :) i'll let you know, i hope you can help me anyway! tnx!!! – markzzz Jul 09 '10 at 23:58
  • I think you have two possible ways to solve that: a) loop through the content and search for opening and closing quote tags and replace them if both were found (leave the rest as visible bbcode) or b) use `preg_replace_callback()` that calls itself again if a nested quote tags was found. – mgutt Mar 30 '17 at 19:38

2 Answers2

4

This is an old Q but I'll post my solution anyway for ppl =]

$open = '<blockquote><span class="bold">Quote: </span><br />'; //the next few lines do the parsing for quote blocks. We 
        $close = '</blockquote>';                                      //have to do it outside the normal parsing arrays because that way does not allow nesting.

        preg_match_all ('/\[quote\]/i', $str, $matches);
        $opentags = count($matches['0']);

        preg_match_all ('/\[\/quote\]/i', $str, $matches);
        $closetags = count($matches['0']);

        $unclosed = $opentags - $closetags;
        for ($i = 0; $i < $unclosed; $i++) {
                $str .= '</blockquote>';
        }
//Do Quotes (nested)
        $str = str_replace ('[quote]', $open, $str);
        $str = preg_replace('/\[quote\=(.*?)\]/is','<blockquote class="darkbg"><span class="bold left">Quote: $1</span><br />', $str);
        $str = str_replace ('[/quote]', $close, $str);
return $str;

Peace.

TylerT
  • 87
  • 8
1

See here: Recursive patterns on the PHP manual.

This may also interest you, though it's more of a technicality: Why is recursive regex not regex?

Community
  • 1
  • 1
Artefacto
  • 96,375
  • 17
  • 202
  • 225