本帖最后由 vinsonwang 于 2011-2-28 12:00 编辑
*************************************************
** 本教程基于版本:Discuz! X 2.0 **
*************************************************
Archiver 为了提高搜索引擎收录,作为面向搜索引擎入口的同时,有些站长在不同的站之间也通过它来进行数据库的采集,之前版本的程序中并没有对 bbcode 进行解析,采集的数据原原本本的传到新站点,通过 bbcode 保留之前的文本格式,但X2在用户友好性方面对 archiver 做了改进,可以作为正常页面阅读,去掉了 bbcode 的 标签,保留 bbcode 标签中的内容。站长想保留原格式文本,可以修改代码,下面就对X2 处理 bbcode 的方式介绍一下。 在 Discuz! X2.0 中,为 Archiver 作了一个单独的入口,打开页面后会看到 Archiver 的链接为 http://xxxxx.com/archiver/。默认情况下,直接访问 archiver 文件下的 index.php 文件。下面就来看看 index.php 入口文件都有哪些内容:
- define('IN_ARCHIVER', 1);//定义为archiver状态。
- chdir('../');//把目录切换到上级目录状态。
- $querystring = $_SERVER['QUERY_STRING'];//取得上一操作的url第一个‘?’后的字符串。
- if(!empty($_GET['action'])) {
- $querystring = $_GET['action'].'-'.$_GET['value'];//把&符号换成‘-’号。
- }
- if(substr($querystring, 0, 3) == 'fid') {//判断上方获得的字符串中的字段,并赋值操作。
- $_GET['mod'] = 'forumdisplay';
- $_GET['fid'] = intval(substr($querystring, 4));
- } elseif(substr($querystring, 0, 3) == 'tid') {
- $_GET['mod'] = 'viewthread';
- $_GET['tid'] = intval(substr($querystring, 4));
- }
- include 'forum.php';//引入上级目录的forum.php文件。
复制代码
与 Discuz! X1.5 的区别在于,Discuz!X1.5 直接访问 forum.php,在文件里判断识别是否 IN_ARCHIVER。 在 Discuz! X2.0 版本中,希望 Archiver 能够过滤掉 bbcode 但是留下所有包含在 bbcode 中的内容。下面看看代码中是如何处理的,这个功能主要是 archivermessage();函数实现的。
- function archivermessage($message) {
- return nl2br(preg_replace(
- array('/&(#\d{3,5};)/', "/\[hide=?\d*\](.+?)\[\/hide\]/is", "/\[\/?\w+=?.*?\]/"),
- array('&\\1','<b>**** Hidden Message *****</b>',''),//标签[][/]替换为空
- str_replace(
- array('&', '"', '<', '>', "\t", ' ', ' '),
- array('&', '"', '<', '>', ' ', ' ', ' '),
- $message)));
- }
复制代码
红色部分即为正则替换掉的标签部分。如果为了方便想通过 Archiver 做数据采集等可直接去掉相应代码即可。
|