Как я могу заменить первый и последний экземпляр в 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);
С помощью этой информации вы можете динамически генерировать конкретную замену регулярных выражений для каждой кавычки, работающей от самого внутреннего до самого внешнего