DEDE 系统后台自动添加锚文本规则是全匹配,有些版本是按关键词标签来匹配的。只要你在文档关键词中添加了的关键词都会在文章中添加,这样有些瑕疵。例如 “苹果” 与 “苹果电脑“ 是包含关系。将会嵌套地添加锚文本。还有就是不能体现锚文本多样化。 下面是添加这两个功能的方法。
关键词添加:
① 数据库 dede_keywords表中添加字段: item int(8);
② 后台:/dede/templates/ article_keywords_main.htm 和/dede/article_keywords_main.htm 添加“组ID“的相关选项, 添加 组ID选项。频率为同组中关键词出现的概率。
选取关键词,自动添加锚文本:
思路:
① 第一次筛选:文章中与文档关键词库匹配的所有关键词。
② 第二次筛选:上次筛选中,再把相同item号的关键词中按它们的概率抽取出其中的一个。
③ 文章中与筛选后的关键词匹配的关键词做成锚文本,并在文章中添加“已加锚文本的标签(<!--ANCHOR_ADDED-->)“(防止再生成或修改文章时锚文本变动),写入数据表。
PS:要想重新添加锚文本,在文章编辑中去掉<!--ANCHOR_ADDED-->。
代码:
涉及文件include/arc.archives.class.php
在文件最后添加概率选取函数如下:
/*概率选取
* @param $proArr =array('a'=>20,'b'=>30,'c'=>50);
*/
function get_rand($proArr) {
$result = '';
//概率数组的总概率精度
$proSum = array_sum($proArr);
//概率数组循环
foreach ($proArr as $key => $proCur) {
$randNum = mt_rand(1, $proSum); //抽取随机数
if ($randNum <= $proCur) {
$result = $key; //得出结果
break;
} else {
$proSum -= $proCur;
}
}
unset ($proArr);
return $result;
}
修改函数 ReplaceKeyword($kw,&$body) 如下:
/**
* 高亮问题修正, 排除alt title <a></a>直接的字符替换
*
* @param string $kw
* @param string $body
* @return string
*/
function ReplaceKeyword($kw,&$body)
{
if(stripos($body,'ANCHOR_ADDED'))
{
//文档已添加过锚文本
return $body;
}
global $cfg_cmspath;
$maxkey = 5;
$kws = explode(",",trim($kw)); //以分好为间隔符
$i=0;
$karr = $kaarr = $GLOBALS['replaced'] = array();
//暂时屏蔽超链接
$body = preg_replace("#(<a(.*))(>)(.*)(<)(\/a>)#isU", '\\1-]-\\4-[-\\6', $body);
$query = "SELECT * FROM #@__keywords WHERE rpurl<>'' AND sta=1 ORDER BY item DESC";
$this->dsql->SetQuery($query);
$this->dsql->Execute();
if( $this->dsql->GetTotalRow() > 0 )
{
$keyarr = $keyurlarr = array();
while($row = $this->dsql->GetArray())
{
//提取文中出现的关键词,按组ID分组
if(strpos($body, $row['keyword']) !== false)
{
$keywordarr[$row['item']][trim($row['keyword'])] = $row['rank'];
$keyurlarr[trim($row['keyword'])] = $row['rpurl'];
}
}
//关键词进一步概率筛选
foreach($keywordarr as $v)
{
$key = get_rand($v);
$key_url = $keyurlarr[$key];
$karr[] = $key;
$kaarr[] = '<a href="'.$key_url.'" target="_blank"><u>'.$key.'</u></a>';
}
}
file_put_contents('d:/debug.txt',var_export($karr,true)."\n\n\n", FILE_APPEND);
file_put_contents('d:/debug.txt',var_export($kaarr,true)."\n\n\n", FILE_APPEND);
// 这里可能会有错误
$body = @preg_replace("#(^|>)([^<]+)(?=<|$)#sUe", "_highlight('\\2', \$karr, \$kaarr, '\\1')", $body);
//恢复超链接
$body = preg_replace("#(<a(.*))-\]-(.*)-\[-(\/a>)#isU", '\\1>\\3<\\4', $body);
//添加已锚文本化的标识<!--ANCHOR_ADDED-->
$body = '<!--ANCHOR_ADDED-->'.$body;
$upquery = "UPDATE `#@__addonarticle` SET body='$body' WHERE aid='$this->ArcID'";
$this->dsql->ExecuteNoneQuery($upquery);
return $body;
}
}//End Archives
dede版本 5.7 gbk ,基本可以,没有全面测试。有问题可以探讨。
修改后文件下载:
浙公网安备 33010602011771号