今天闲来无事,修改了一下帝国CMS内容页相关文章分词调取
2020-12-27 18:50:13海洋跨境电商博客日记0
以前我自己都是自己写后台和前端页面,由于要求越来越高就没有太多的心思去写代码了,于是经过多方的考证采用了帝国的CMS系统作为后台,主要两点:1、帝国安全性做的非常好,不用过于担心网站被黑客挂马,自己写的代码由于小众也没有被挂马过,但是有一次出现了漏洞被篡改了页面,没有找到具体的楼栋点,反正也要换系统了所以就没有找漏洞。2、生成静态页毫无压力,这是我使用帝国CMS系统的原因。
选择帝国的原因
至于其他的dede织梦一类的虽然实现功能上比较方便,但是安全性太差了,索性就不考虑了。
无论用什么系统做后台,制作的页面网站最终都是为了有流量,排名好才能有流量,所以SEO就是考虑的主要因素。以前一直用多个关键词调取相关文章方式,后来采用了标题相似度的调取方式。
调取代码实现
内心其实一直想弄个和百度搜索那样的调取方式,当你打开百度知道,文章最下面的相关文章匹配的非常好,也非常有利于SEO的优化,具体代码我分享在洋哥日记网站了,如果需要的话可以登录 zhanghaiyang.net 进行索取代码。
帝国文件修改
首先打开帝国cms系统中的e/class/functions.php 文件中最下面增加以下代码:
//下面是中文分词函数
function ChineseWordSegment($str){
$words = array();
//utf-8 编码的正则,分别意思是: 英文符号与空格|英文及数字|汉字范围一|汉字范围二
//汉字占三个字符
$pa = "/[[:punct:]|\s_]+|[a-z0-9]+|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]/mi";
//若网站是 gb2312 编码,则汉字占两个字符,正则应改为
//$pa = "/[[:punct:]|\s_]+|[a-z0-9]+|[x80-xff]{2}/mi";
//排除汉字中的符号
$punctcn = "~!·#¥%…—*()—+{}[]|、;:‘’“”,。《》?/ ";
//按正则把$str分割成数组 $r
//$r元素的值可能为:一串英文符号与空格,一串英文及数字,一个汉字或汉字符号
preg_match_all($pa,$str,$r);
$lv = '';
//把相临的2个汉字组成一个"词"
foreach($r[0] as $k=>$v) {
//如果不是汉字
//过滤掉英文符号或空格,单个字母或数字
//不和前一个元素组合,而自成一个"词"
if(ord($v[0])<128){
if(preg_match('/^[a-z0-9]{2,}$/i',$v)) $words[] = $v;
$lv = '';
continue;
}
//如果是汉字符号,过滤掉,不组"词"
if(strrchr($punctcn,$v)){
$lv = '';
continue;
}
//汉字,和前一个汉字组成一个"词"
if($lv) $words[] = $lv.$v;
$lv = $v;
}
return $words;
}
//计算一个词语在内容中出现的次数
function showtimes($word,$content){
$nc = str_replace("$word","",$content);
return (strlen($content)-strlen($nc))/strlen($word);
}
上面是分词函数,在模板中调用即可。
内容模板实现代码
进入帝国后台模板-内容模板中添加以下代码
$title=$navinfor[title] ; //调取当前文章标题
$id=$navinfor[id] ; //调取当前文章ID
$words = ChineseWordSegment($title); //把文章的标题进行分词
$sqlstr = '(';
foreach($words as $k=>$w){
// $im 为该分词的权重.
// 在文章内容中出现该词的次数越多,该词 like 匹配的结果数字会越大
// 则含有该词的标题越容易排在前面
$im = 1 + showtimes($w,strip_tags($title)); //计算标题中分词的权重
$sqlstr .= ($k?'+':'')."(`neirong` like '%".$w."%')*$im";
}
$sqlstr .= ")";
$mysql = "select *,$sqlstr as mylike from {$dbtbpre}ecms_news where id<>$id and $sqlstr order by mylike desc,rand() limit 10";
$sql=$empire->query($mysql);
while($bqr=$empire->fetch($sql)){ ?>
<li><a href="<?=$bqr['titleurl']?>" title="<?=$bqr['title']?>" target="_self"><span><?=date('Y-m-d',$bqr[newstime])?></span><h3><?=$bqr['title']?></h3></a></li>
<? } ?>
上一篇返回列表