DEDE文档关键字维护中设置词汇重叠后出错的修改办法

用DEDE系统的文档关键字维护,倘若增加两个关键字为“DEDE”和“DEDE先生”,那样在文章中出现“DEDE先生”这个词的时候,锚文本HTML就会出错,我想这是不少用过这个功能的SEOer见到过的。

在非常早以前我就发现过,但由于自己已经很久没用DEDE系统了,只不过这次帮顾客修改时,有这个需要,就在这里做一下记录。

需要修改两个函数,都在同一个文件中(include/arc.archives.class.php),一个是类Archives中的ReplaceKeyword函数,另一个是文件最末尾的_highlight函数。

修改网站源码中把DEDE原版代码注释掉了,以便比较网站源码和理解修改思路,网站源码如下:

/** * 高亮问题修正, 排除alt title <a></a>直接的字符替换 * * @param string $kw * @param string $body * @return string */function ReplaceKeyword{global $cfg_cmspath;$maxkey = 5;$kws = explode);//以分好为间隔符$i=0;$karr = $kaarr = $GLOBALS['replaced'] = array;//暂时屏蔽超链接$body = preg_replace)#isU", '\1-]-\4-[-\6', $body);// $query = "SELECT * FROM keywords WHERE rpurl<>'' ORDER BY rank DESC"; // 原版的$query="SELECT * FROM `keywords` WHERE rpurl<>'' and sta=1 ORDER BY length DESC"; // 修改 优先处置长关键字$this->dsql->SetQuery;$this->dsql->Execute;while){$key = trim;$key_url=trim;$karr[] = $key;$kaarr[] = "<a class='title-prefix' href='$key_url' target='_blank'>$key</a>"; // 删除 <u> 和 </u> ,增加class属性}// 这里可能会有错误// $body = @preg_replace#sUe", "_highlight", $body);foreach {$body = preg_replace/sUe", "_highlight", $body);//echo $body."<br/>";//恢复超链接$body = preg_replace)-]--[-/isU", '\1>\3<\4', $body);//暂时屏蔽超链接$body = preg_replace)/isU", '\1-]-\4-[-\6', $body);}//恢复超链接$body = preg_replace)-]--[-#isU", '\1>\3<\4', $body);return $body;}

//高亮专用, 替换多次是可能否达到最多次function _highlight{global $cfg_replace_num;$string = str_replace;if{return $pre.$string;}if{// foreach // {// if// {// continue;// }//$string = preg_replace."#", $result[$key], $string, $cfg_replace_num);$string = preg_replace."#", $result, $string, $cfg_replace_num);// 修改后if !== FALSE){$GLOBALS['replaced'][$words] = 1;}// }}else{$string = str_replace;}return $pre.$string;}