Tell me more ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

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

share|improve this question
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 regular-expressions.info - it's a better introduction than the PHP manual. – mario Jul 9 '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 9 '10 at 23:58

2 Answers

up vote 1 down vote accepted

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?

share|improve this answer

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.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.