发帖的时候点击设置主题标签,然后点击自动获取,就会返回帖子内容里的关键字。
下面是自动获取的源代码码
- <a href="javascript:;" id="clickbutton[]" class="xi2">自动获取</a>
复制代码 由源码可以看出来,点击自动获取的时候会触发一个js函数relatekw().
找到forum_post.js文件,找到relatekw函数,具体代码如下。
- function relatekw(subject, message, recall) {
- if(isUndefined(recall)) recall = '';
- if(isUndefined(subject) || subject == -1) {
- subject = $('subject').value;
- subject = subject.replace(/<\/?[^>]+>|\s|\[\/?.+?\]|"/ig, "");
- }
- if(isUndefined(message) || message == -1) {
- message = getEditorContents();
- message = message.replace(/<\/?[^>]+>|\s|\[\/?.+?\]|"/ig, "");
- }
- subject = (BROWSER.ie && document.charset == 'utf-8' ? encodeURIComponent(subject) : subject);
- message = (BROWSER.ie && document.charset == 'utf-8' ? encodeURIComponent(message) : message);
- message = message.replace(/&/ig, '', message).substr(0, 500);
- ajaxget('forum.php?mod=relatekw&subjectenc=' + subject + '&messageenc=' + message, 'tagselect', '', '', '', recall);
- }
复制代码 通过这个函数可以发现最后是通过ajax传递到forum.php?mod=relatekw这个地址了。
找到source\module\forum\forum_relatekw.php文件。
- if($tid = @intval($_GET['tid'])) {
- $posttable = getposttablebytid($tid);
- $query = DB::query("SELECT pid, subject, message FROM ".DB::table($posttable)." WHERE tid='$tid' AND first='1'");
- $data = DB::fetch($query);
- $subject = $data['subject'];
- $message = cutstr($data['message'], 500, '');
- $pid = $data['pid'];
- } else {
- $subject = $_GET['subjectenc'];
- $message = $_GET['messageenc'];
- }
复制代码 这段代码首先判断有没有传递tid,这里ajax传递的变量里并没有tid,所以这里进入else流程,对$subject、$message进行赋值。
- $subjectenc = rawurlencode(strip_tags($subject));
- $messageenc = rawurlencode(strip_tags(preg_replace("/\[.+?\]/U", '', $message)));
复制代码
对变量$subject跟$message进行处理,去除html标签跟discuz代码。
- $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文件。
- if($data) {
- if(PHP_VERSION > '5' && CHARSET != 'utf-8') {
- require_once libfile('class/chinese');
- $chs = new Chinese('utf-8', CHARSET);
- }
- $parser = xml_parser_create();
- xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
- xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
- xml_parse_into_struct($parser, $data, $values, $index);
- xml_parser_free($parser);
- $kws = array();
- foreach($values as $valuearray) {
- if($valuearray['tag'] == 'kw' || $valuearray['tag'] == 'ekw') {
- $kws[] = !empty($chs) ? $chs->convert(trim($valuearray['value'])) : trim($valuearray['value']);
- }
- }
- $return = '';
- if($kws) {
- foreach($kws as $kw) {
- $kw = htmlspecialchars($kw);
- $return .= $kw.' ';
- }
- $return = htmlspecialchars($return);
- }
- if(!$tid) {
- $_G['inajax'] = 1;
- include template('forum/relatekw');
- } elseif($kws) {
- loadcache('censor');
- $posttable = getposttablebytid($_G['tid']);
- DB::query("UPDATE ".DB::table($posttable)." SET tags='".implode(',', $kws)."' WHERE pid='$pid'");
- }
- }
复制代码 这段就是解析返回的xml文件,获取返回tag关键词。
|