东方星雨

简单网络

一个爱好网络的80后男站长。

关注我东方星雨个人微信号:476847113

您现在的位置是:首页 > 站长日志

帝国CMS重复关键字替换解决方案

2018-09-03 站长 站长日志

banner4.jpg

使用帝国CMS建站的朋友们都知道帝国CMS系统有一个内容关键字替换的功能,可是随着关键字的增多,问题的来了,那么是什么问题呢!我们来分析一下。

首先给你这么这个关键字:帝国CMS建站,帝国CMS,帝国,程序代码如下:

 

$str='帝国CMS建站管理系统,最安全的网站建设系统';
$keyboard = '帝国CMS建站,帝国CMS,帝国';
$kr = explode(',',$keyboard);
foreach($kr as $v)
{
$str=str_replace($v,'<a href="http://www.dgcms.cn" target="_blank" class="infotextkey">'.$v.'</a>',$str);
}
输出的结果步骤源代码为:
1、<a href="http://www.dgcms.cn" target="_blank" class="infotextkey">帝国CMS建站</a>管理系统,最安全的网站建设系统
2、<a href="http://www.dgcms.cn" target="_blank" class="infotextkey"><a href="http://www.dgcms.cn"target="_blank" class="infotextkey">帝国CMS</a>建站</a>管理系统,最安全的网站建设系统
3、<a href="http://www.dgcms.cn" target="_blank" class="infotextkey"><a href="http://www.dgcms.cn"target="_blank" class="infotextkey"><a href="http://www.dgcms.cn" target="_blank" class="infotextkey">帝国</a>CMS</a>建站</a>管理系统,最安全的网站建设系统

 

从结果我们可以看出,有多个相同的关键字被连续替换了,这样出现的结果是会造成页面的错乱,那么该如何来解决这个问题呢!解决思路如下:

仔细观察我们发现当中是有一定规律的,它们的规律是:class="infotextkey">关键字,所以我们可以利用这个特性来做一下修改,修改如下:

 

$str='帝国CMS建站管理系统,最安全的网站建设系统';
$keyboard = '帝国CMS建站,帝国CMS,帝国';
$kr = explode(',',$keyboard);
foreach($kr as $v)
{
if(strpos($str,'class="infotextkey">'.$v)==false){
$str=str_replace($v,'<a href="http://www.dgcms.cn" target="_blank" class="infotextkey">'.$v.'</a>',$str);
}
}
 

它的原理就是,在第二次替换的时候,先检查一下当前关键字是否已经被替换过一次了,如果没有替换过,就替换。

啰嗦了这么多,小白可能不耐烦了,想知道在帝国CMS里该如何操作,答案如下:
1、打开/e/class/functions.php文件,下拉到470行,截图如下:
QQ截图20151022210242.jpg
换截图中的函数代码替换成如下代码:
//替换关键字 UTF-8版
function ReplaceKey($newstext,$classid=0){
global $empire,$dbtbpre,$public_r,$class_r;
if(empty($newstext)||$class_r[$classid]['keycid']==-1)
{return $newstext;}
$where='';
if(!empty($class_r[$classid]['keycid']))
{
$where=" where cid='".$class_r[$classid]['keycid']."'";
}
$sql=$empire->query("select keyname,keyurl from {$dbtbpre}enewskey".$where);
while($r=$empire->fetch($sql))
{
if(strpos($newstext,'class="infotextkey">'.$r[keyname])==false) {
if (STR_IREPLACE) {
$newstext = empty($public_r[repkeynum]) ? str_ireplace($r[keyname], '<a href=' . $r[keyurl] . ' target=_blank class=infotextkey>' . $r[keyname] . '</a>', $newstext) : preg_replace('/' . $r[keyname] . '/i', '<a href=' . $r[keyurl] . ' target=_blank class=infotextkey>' . $r[keyname] . '</a>', $newstext, $public_r[repkeynum]);
} else {
$newstext = empty($public_r[repkeynum]) ? str_replace($r[keyname], '<a href=' . $r[keyurl] . ' target=_blank class=infotextkey>' . $r[keyname] . '</a>', $newstext) : preg_replace('/' . $r[keyname] . '/i', '<a href=' . $r[keyurl] . ' target=_blank class=infotextkey>' . $r[keyname] . '</a>', $newstext, $public_r[repkeynum]);
}
}
}
return $newstext;
}

红色字体部分就是我们要添加的,这个方法简单有效。最后再补充一点,是针对GBK编码版本的问题,当你在替换的时候会发现一个非常奇怪的问题,举例如下:

 

$str1='有可';
if (strstr($str1 , '锌')) {
    echo '找到了!';
}else{
    echo '没找到!';
}

在GBK编码下,你会惊讶的发现,输出的结果是:找到了!,在UTF-8编码下却是我们正常逻辑理解的:没找到!,这个问题我纠结了小半天,后来得到群里的轩儿(玛仙)提供了解决方案才得以解决,他给的方案是在GBK下需要转换编码,具体操作如下:

QQ图片20151022212354.png

所以根据他提供的方案,在GBK编码下我做了如下修改:

 

//替换关键字 GBK版
function ReplaceKey($newstext,$classid=0){
global $empire,$dbtbpre,$public_r,$class_r;
if(empty($newstext)||$class_r[$classid]['keycid']==-1)
{return $newstext;}
$where='';
if(!empty($class_r[$classid]['keycid']))
{
$where=" where cid='".$class_r[$classid]['keycid']."'";
}
$sql=$empire->query("select keyname,keyurl from {$dbtbpre}enewskey".$where);
$newstext2 = iconv('GBK','UTF-8',$newstext);
while($r=$empire->fetch($sql))
{
if (strpos($newstext2 , iconv('GBK','UTF-8',$r[keyname])) !== false) {
if (strpos($newstext, 'class="infotextkey">' . $r[keyname]) == false) {
if (STR_IREPLACE) {
$newstext = empty($public_r[repkeynum]) ? str_ireplace($r[keyname], '<a href=' . $r[keyurl] . ' target=_blank class=infotextkey>' . $r[keyname] . '</a>', $newstext) : preg_replace('/' . $r[keyname] . '/i', '<a href=' . $r[keyurl] . ' target=_blank class=infotextkey>' . $r[keyname] . '</a>', $newstext, $public_r[repkeynum]);
} else {
$newstext = empty($public_r[repkeynum]) ? str_replace($r[keyname], '<a href=' . $r[keyurl] . ' target=_blank class=infotextkey>' . $r[keyname] . '</a>', $newstext) : preg_replace('/' . $r[keyname] . '/i', '<a href=' . $r[keyurl] . ' target=_blank class=infotextkey>' . $r[keyname] . '</a>', $newstext, $public_r[repkeynum]);
}
}
}
}
return $newstext;
}

OK,整个教程就说到这,有什么问题请留言!

文章评论