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 做資料採集等可直接去掉相應程式碼即可。