preg_replace_callback BB代码多个实例

时间:2014-06-03 17:49:51

标签: php regex preg-replace-callback

我目前正在开发一个论坛。在线程中,我希望用户能够在自己的帖子中引用其他帖子。它到目前为止工作,我唯一的问题是引号内的引号。

这是我的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代码,第一个和第二个引用正在起作用。但是,报价中的报价不起作用。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我不完全确定你的帖子中有什么要找,但也许你可以使用这样的东西来获取引号之间的内容。

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

这将返回:

Whats up?[/quote]

这应该适用于模式的单个实例,但是如果您可以拥有多个实例,则可能需要包含否定前瞻,以确保在[/quote]后不会直接显示[/quote]

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

Here is an example for you to tinker around with.

我想如果你有一个像[/quote][/quote]这样的字符串会有效,但是如果你在这些标签之间有某些东西就行不通。 [/quote] sdf [/quote]。这就是为什么我添加了删除任何剩余[/quote]标记的链接。

希望这样的事情就是你所追求的。