preg_replace_callback BB-код несколько экземпляров

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

Вот мой PHP-код:

<?php
$text = preg_replace_callback('/\[quote=([^]]+);([0-9]+)\]([^]]+)\[\/quote\]/i', function($matches){

   // Include MySQLi into function
   global $DB;

   $get = $DB->query("SELECT quote.date, quote.text, user.username FROM forum AS quote INNER JOIN users AS user ON quote.userid = user.id WHERE quote.id = '".beforeDB($matches[2])."'");
   $row = $get->fetch_array();

   if($get->num_rows == 0)
      return "";

   $return = '
   <div class="box table">
   <table width="100%">
    <tr style="height: 22px;"><td style="width: 122px; background: #e8e8e8;"><div style="font-weight: bold; padding-top: 5px; '.(userColor($row['username']) != false ? 'color: '.userColor($row['username']).';' : '').'">'.$row['username'].'</div></td><td style="background: #e8e8e8; padding-left: 5px;">'.dateFunction($row['date'], true, true, true).'</td></tr>
    <tr><td colspan="2" style="border-top: 1px solid #aaaaaa; background: #efefef; padding: 3px;">'.$row['text'].'</td></tr>
   </table>
   </div>
   ';

   return $return;

  }, $text); 
?>

Это, как я уже говорил, работает. В таблице форума хранятся как сообщения, так и темы.

Однако, если я напишу это в сообщении, это не сработает:

[quote=Admin;1]Hi guys![/quote]

[quote=Admin;1]Hi guys!

[quote=Mod;3]Whats up?[/quote][/quote]

С приведенными выше BB-кодами работают первая и вторая котировки. Однако кавычки внутри цитаты не работают. Как я могу это исправить?


person Teskon    schedule 03.06.2014    source источник
comment
Вы можете создать рекурсивную функцию, которая заменяет только самый внутренний тег цитаты, пока не останется тегов цитаты для замены.   -  person Casimir et Hippolyte    schedule 03.06.2014
comment
Вот один из способов получить самый внутренний (или последний) тег цитаты ~.*\K\[quote=([^;]+);(\d+)\].*?\[/quote\]~is   -  person Sam    schedule 03.06.2014
comment
Попробовал твое регулярное выражение, Сэм. К сожалению, работает не со всеми кавычками (как я догадался). Насчет рекурсивной функции: пробовал, не работает. Функция preg_replace_callback внутри функции не выполняется более одного раза.   -  person Teskon    schedule 03.06.2014


Ответы (1)


Я не совсем уверен из вашего поста, что вы ищете, но, возможно, вы можете использовать что-то подобное, чтобы получить содержимое между тегами цитаты.

~\[quote=.*?\](.*)\[/quote\]~i

Это вернет:

Whats up?[/quote]

Это должно работать для отдельных экземпляров шаблона, однако, если у вас может быть несколько экземпляров, вы, вероятно, захотите включить отрицательный просмотр вперед, чтобы убедиться, что [/quote] не появляется сразу после [/quote].

~\[quote=.*?\].*?\[/quote\](?!\[/quote\])~i

Вот пример, с которым вы можете поработать.

Я думаю, это сработает, если у вас есть строка типа [/quote][/quote], но это не сработает, если у вас есть что-то между этими тегами. [/quote] sdf [/quote]. Вот почему я добавил ссылку, чтобы удалить все оставшиеся теги [/quote].

Надеюсь, это то, что вам нужно.

person Quixrick    schedule 06.06.2014