Archiver 為了提高搜索引擎收錄,作為面向搜索引擎入口的同時,有些站長在不同的站之間也通過它來進行數據庫的採集,之前版本的程序中並沒有對 bbcode 進行解析,採集的數據原原本本的傳到新站點,通過 bbcode 保留之前的文本格式,但 X2 在用户友好性方面對 archiver 做了改進,可以作為正常頁面閲讀,去掉了 bbcode 的標籤,保留 bbcode 標籤中的內容。站長想保留原格式文本,可以修改代碼,下面就對 X2 處理 bbcode 的方式介紹一下。Discuz! X2.0 中,為 Archiver 作了一個單獨的入口,打開頁面後會看到 Archiver 的鏈接為 http://xxxxx.com/archiver/默認情況下,直接訪問 archiver 文件下的 index.php 文件。下面就來看看 index.php 入口文件都有哪些內容:

  1. define('IN_ARCHIVER', 1);//定義為 archiver 狀態。
  2. chdir('../');//把目錄切換到上級目錄狀態。
  3. $querystring = $_SERVER['QUERY_STRING'];//取得上一操作的 url 第一個 『?』 後的字符串。
  4. if(!empty($_GET['action'])) {
  5.          $querystring = $_GET['action'].'-'.$_GET['value'];//把& 符號換成 『-』 號。
  6. }
  7. if(substr($querystring, 0, 3) == 'fid') {//判斷上方獲得的字符串中的字段,並賦值操作。
  8.          $_GET['mod'] = 'forumdisplay';
  9.          $_GET['fid'] = intval(substr($querystring, 4));
  10. } elseif(substr($querystring, 0, 3) == 'tid') {
  11.          $_GET['mod'] = 'viewthread';
  12.          $_GET['tid'] = intval(substr($querystring, 4));
  13. }
  14. include 'forum.php';//引入上級目錄的 forum.php 文件。

Discuz! X1.5 的區別在於,Discuz!X1.5 直接訪問 forum.php,在文件裏判斷識別是否 IN_ARCHIVER 。

Discuz! X2.0 版本中,希望 Archiver 能夠過濾掉 bbcode   但是留下所有包含在 bbcode 中的內容。下面看看代碼中是如何處理的,這個功能主要是 archivermessage(); 函數實現的。

  1. function archivermessage($message) {
  2.          return nl2br(preg_replace(
  3.                             array('/&(#d{3,5};)/', "/[hide=?d*](.+?)[/hide]/is", "/[/?w+=?.*?]/"),
  4.                             array('&1','<b>**** Hidden Message *****</b>',''),//標籤 [][/] 替換為空
  5.                    str_replace(
  6.                             array('&', '"', '<', '>', " ", '   ', '  '),
  7.                             array('&', '"', '<', '>', '        ', '   ', '  '),
  8.                    $message)));
  9. }

紅色部分即為正則替換掉的標籤部分。如果為了方便想通過 Archiver 做數據採集等可直接去掉相應代碼即可。