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

3
  • 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. Commented Jul 9, 2010 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!!! Commented Jul 9, 2010 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. Commented Mar 30, 2017 at 19:38

2 Answers 2

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.

Sign up to request clarification or add additional context in comments.

1 Comment

You took care about unclosed tags. What if unopened ones exist as well?
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?

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.