Regex вложенные цитаты форума (BBCode)
Возможный дубликат:
php regex [b] to ;
У меня проблемы с регулярным выражением, я абсолютный регулярный член, нуб. Я не вижу, что происходит с попыткой конвертировать HTML обратно в "BBCode".
Может ли кто-нибудь взглянуть на функцию "unquote" и сказать мне очевидную ошибку, которую я делаю? (Я знаю, это очевидно, потому что я всегда нахожу неочевидные ошибки)
ПРИМЕЧАНИЕ: я не использую рекурсивное регулярное выражение, потому что я не мог разобраться с этим и уже начал этот способ сортировки цитат, чтобы они были вложенными.
<?php
function quote($str){
$str = preg_replace('@\[(?i)quote=(.*?)\](.*?)@si', '<div class="quote"><div class="quote-title">\\1 wrote:</div><div class="quote-inner">\\2', $str);
$str = preg_replace('@\[/(?i)quote\]@si', '</div></div>', $str);
return $str;
}
function unquote($str){
$str = preg_replace('@\<(?i)div class="quote"\>\<(?i)div class="quote_title"\>(.*?)wrote:\</(?i)div\><(?i)div class="quote-inner"\>(.*?)@si', '[quote=\\1]\\2', $str);
$str = preg_replace('@\</(?i)div\></(?i)div\>@si', '[/quote]', $str);
}
?>
Это всего лишь некоторый код, чтобы помочь проверить это:
<html>
<head>
<style>
body {
font-family: sans-serif;
}
.quote {
background: rgba(51,153,204,0.4) url(../img/diag_1px.png);
border: 1px solid rgba(116,116,116,0.36);
padding: 5px;
}
.quote-title, .quote_title {
font-size: 18px;
margin: 5px;
}
.quote-inner {
margin: 10px;
}
</style>
</head>
<body>
<?php
$quote_text = '[quote=VCMG][quote=2xAA]DO RECURSIVE QUOTES WORK?[/quote]I have no idea.[/quote]';
$quoted = quote($quote_text);
echo $quoted.'<br><br>'.unquote($quoted); ?>
</body>
Заранее спасибо, Сэм.
2 ответа
Ну, вы могли бы начать с установки вашего класса php либо quote-title
или же quote_title
но держите это последовательным.
Затем добавьте return $str;
к вашей второй функции, и вы должны быть почти там.
И вы можете немного упростить свое регулярное выражение:
function quote($str){
$str = preg_replace('@\[quote=(.*)\]@siU', '<div class="quote"><div class="quote-title">\\1 wrote:</div><div class="quote-inner">', $str);
$str = preg_replace('@\[/quote\]@si', '</div></div>', $str);
return $str;
}
function unquote($str){
$str = preg_replace('@<div class="quote"><div class="quote-title">(.*) wrote:</div><div class="quote-inner">@siU', '[quote=\\1]', $str);
$str = preg_replace('@</div></div>@si', '[/quote]', $str);
return $str;
}
Но остерегайтесь замены различными вызовами начальных и конечных тегов ваших цитат. Я полагаю, что кавычки могут создать некоторые странные поведения, если у вас есть другие bbcode, создающие </div></div>
код.
Лично я пользуюсь тем фактом, что полученный HTML в основном:
<div class="quote">Blah <div class="quote">INCEPTION!</div> More blah</div>
Повторно запускайте регулярное выражение, пока не останется больше совпадений:
do {
$str = preg_replace( REGEX , REPLACE , $str , -1 , $c);
} while($c > 0);
Кроме того, сделайте это одним регулярным выражением, чтобы сделать это проще:
'(\[quote=(.*?)\](.*?)\[/quote\])is'
'<div class="quote"><div class="quote-title">$1 wrote:</div><div class="quote-inner">$1</div></div>'