Как я могу заменить первый и последний экземпляр в preg заменить обратный вызов на PHP?

Я создаю пользовательский форум на PHP и CodeIgniter. Я пытаюсь закодировать парсер bbCode, но столкнулся с небольшой проблемой. Я использую preg_replace_callback для замены тегов [quote id=123][/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;
}

1 ответ

Что если вы запустите регулярное выражение, чтобы сначала найти все кавычки примерно так:

$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);

С помощью этой информации вы можете динамически генерировать конкретную замену регулярных выражений для каждой кавычки, работающей от самого внутреннего до самого внешнего

Другие вопросы по тегам