Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

X2发帖时的自动获取tag功能分析

[复制链接]
dongdong0925 发表于 2011-3-14 12:15:38 | 显示全部楼层 |阅读模式
发帖的时候点击设置主题标签,然后点击自动获取,就会返回帖子内容里的关键字。
下面是自动获取的源代码码
  1. <a href="javascript:;" id="clickbutton[]" class="xi2">自动获取</a>
复制代码
由源码可以看出来,点击自动获取的时候会触发一个js函数relatekw().

找到forum_post.js文件,找到relatekw函数,具体代码如下。
  1. function relatekw(subject, message, recall) {

  2.     if(isUndefined(recall)) recall = '';

  3.     if(isUndefined(subject) || subject == -1) {

  4.         subject = $('subject').value;

  5.         subject = subject.replace(/<\/?[^>]+>|\s|\[\/?.+?\]|"/ig, "");

  6.     }

  7.     if(isUndefined(message) || message == -1) {

  8.         message = getEditorContents();

  9.         message = message.replace(/<\/?[^>]+>|\s|\[\/?.+?\]|"/ig, "");

  10.     }

  11.     subject = (BROWSER.ie && document.charset == 'utf-8' ? encodeURIComponent(subject) : subject);

  12.     message = (BROWSER.ie && document.charset == 'utf-8' ? encodeURIComponent(message) : message);

  13.     message = message.replace(/&/ig, '', message).substr(0, 500);

  14.     ajaxget('forum.php?mod=relatekw&subjectenc=' + subject + '&messageenc=' + message, 'tagselect', '', '', '', recall);

  15. }
复制代码
通过这个函数可以发现最后是通过ajax传递到forum.php?mod=relatekw这个地址了。

找到source\module\forum\forum_relatekw.php文件。

  1. if($tid = @intval($_GET['tid'])) {
  2.         $posttable = getposttablebytid($tid);
  3.         $query = DB::query("SELECT pid, subject, message FROM ".DB::table($posttable)." WHERE tid='$tid' AND first='1'");
  4.         $data = DB::fetch($query);
  5.         $subject = $data['subject'];
  6.         $message = cutstr($data['message'], 500, '');
  7.         $pid = $data['pid'];
  8. } else {
  9.         $subject = $_GET['subjectenc'];
  10.         $message = $_GET['messageenc'];
  11. }
复制代码
这段代码首先判断有没有传递tid,这里ajax传递的变量里并没有tid,所以这里进入else流程,对$subject、$message进行赋值。

  1. $subjectenc = rawurlencode(strip_tags($subject));
  2. $messageenc = rawurlencode(strip_tags(preg_replace("/\[.+?\]/U", '', $message)));
复制代码


对变量$subject跟$message进行处理,去除html标签跟discuz代码。

  1. $data = @implode('', file("http://keyword.discuz.com/related_kw.html?ics=".CHARSET."&ocs=".CHARSET."&title=$subjectenc&content=$messageenc"));
复制代码

将处理后的subject跟message传到http://keyword.discuz.com/related_kw.html页面获取分词结果,这里返回的是一个xml文件。

  1. if($data) {

  2.         if(PHP_VERSION > '5' && CHARSET != 'utf-8') {
  3.                 require_once libfile('class/chinese');
  4.                 $chs = new Chinese('utf-8', CHARSET);
  5.         }

  6.         $parser = xml_parser_create();
  7.         xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
  8.         xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
  9.         xml_parse_into_struct($parser, $data, $values, $index);
  10.         xml_parser_free($parser);

  11.         $kws = array();

  12.         foreach($values as $valuearray) {
  13.                 if($valuearray['tag'] == 'kw' || $valuearray['tag'] == 'ekw') {
  14.                         $kws[] = !empty($chs) ? $chs->convert(trim($valuearray['value'])) : trim($valuearray['value']);
  15.                 }
  16.         }

  17.         $return = '';
  18.         if($kws) {
  19.                 foreach($kws as $kw) {
  20.                         $kw = htmlspecialchars($kw);
  21.                         $return .= $kw.' ';
  22.                 }
  23.                 $return = htmlspecialchars($return);
  24.         }

  25.         if(!$tid) {
  26.                 $_G['inajax'] = 1;
  27.                 include template('forum/relatekw');
  28.         } elseif($kws) {
  29.                 loadcache('censor');
  30.                 $posttable = getposttablebytid($_G['tid']);
  31.                 DB::query("UPDATE ".DB::table($posttable)." SET tags='".implode(',', $kws)."' WHERE pid='$pid'");
  32.         }
  33. }
复制代码
这段就是解析返回的xml文件,获取返回tag关键词。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-17 08:51 , Processed in 0.021045 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表