如何用PHP替换preg replace回调中的第一个和最后一个实例?

如何用PHP替换preg replace回调中的第一个和最后一个实例?,php,nested,preg-replace-callback,Php,Nested,Preg Replace Callback,我正在用PHP和CodeIgniter创建一个自定义论坛。我试图编写bbCode解析器,但是,我遇到了一点问题。我使用preg_replace_回调来替换[quote id=123][/quote]标记。如果只有一级引号,它就可以正常工作,但一旦我尝试“嵌套”引号标记,所有内容都会被丢弃。分析quote标记时,它应该替换第一个open quote标记和最后一个close quote标记。相反,它只解析第一个open quote标记和第一个close quote标记。有人能想出一个解决办法吗?这是

我正在用PHP和CodeIgniter创建一个自定义论坛。我试图编写bbCode解析器,但是,我遇到了一点问题。我使用preg_replace_回调来替换[quote id=123][/quote]标记。如果只有一级引号,它就可以正常工作,但一旦我尝试“嵌套”引号标记,所有内容都会被丢弃。分析quote标记时,它应该替换第一个open quote标记和最后一个close quote标记。相反,它只解析第一个open quote标记和第一个close quote标记。有人能想出一个解决办法吗?这是我的代码:

$str = "[quote id=123][quote id=456]This is the second level[/quote]This is the first level[/quote]";

$str = preg_replace_callback("^\[quote id=([0-9]+)\](.*?)\[/quote\]^", "_parse_quote", $str);

return $str;

function _parse_quote($matches){

        $str = '';

        $CI =& get_instance();

        $query_message = "
                SELECT
                        message_id, author_id, date_posted
                FROM forum_messages
                WHERE message_id = ".$matches[1]."
                LIMIT 1";

        if($query_message = $CI->db->query($query_message)){

                if($query_message->num_rows() > 0){

                        $message = $query_message->row_array();

                        $CI->member->get_info($message['author_id']);
                        $author = $CI->member->info;

                        $str = '
                                <blockquote title="Originally posted by '.$author['display_name'].' about '.timespan(strtotime($message['date_posted']), time()).' ago...">
                                        <p>'.$matches[2].'</p>
                                </blockquote>
                                ';

                }

        }

        return $str;
}
$str=“[quote id=123][quote id=456]这是第二级[/quote]这是第一级[/quote]”;
$str=preg\u replace\u回调(“^\[quote id=([0-9]+)\]”(.*?\[/quote\]^,“\u parse\u quote”,$str);
返回$str;
函数_parse_quote($matches){
$str='';
$CI=&get_instance();
$query_message=”
挑选
消息id、作者id、发布日期
来自论坛的消息
其中message_id=“.$匹配[1]”
限制1”;
如果($query\u message=$CI->db->query($query\u message)){
如果($query\u message->num\u rows()>0){
$message=$query\u message->row\u array();
$CI->member->get_info($message['author_id']);
$author=$CI->member->info;
$str='1
“.$matches[2]”

'; } } 返回$str; }
如果运行正则表达式首先查找所有引号,该怎么办

$str = "[quote id=123][quote id=456]This is the second level[/quote]This is the first level[/quote]";
$quotes = null;
preg_match_all('^\[quote id=([0-9]+)\]^', $str, $quotes);
var_dump($quotes);
有了这些信息,您可以为从最内层到最外层的每个报价动态生成特定的正则表达式替换