设为首页收藏本站

PHPIN.NET

 找回密码
 立即注册
查看: 524|回复: 0

[其他] 帝国CMS重复关键字替换解决方案

[复制链接]

374

主题

381

帖子

2554

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2554
发表于 2015-10-23 08:29:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

使用帝国CMS建站的朋友们都知道帝国CMS系统有一个内容关键字替换的功能,可是随着关键字的增多,问题的来了,那么是什么问题呢!我们来分析一下。
首先给你这么这个关键字:帝国CMS建站,帝国CMS,帝国,程序代码如下:
  1. $str='帝国CMS建站管理系统,最安全的网站建设系统';
  2. $keyboard = '帝国CMS建站,帝国CMS,帝国';
  3. $kr = explode(',',$keyboard);
  4. foreach($kr as $v){
  5.     $str=str_replace($v,'[url=http://www.dgmoban.com]'.$v.'[/url]',$str);
  6. }
  7. 输出的结果步骤源代码为:
  8. 1、[url=http://www.dgmoban.com]帝国CMS建站[/url]管理系统,最安全的网站建设系统
  9. 2、[url=http://www.dgmoban.com]帝国CMS[/url]建站管理系统,最安全的网站建设系统
  10. 3、[url=http://www.dgmoban.com]帝国[/url]CMS建站管理系统,最安全的网站建设系统
复制代码

从结果我们可以看出,有多个相同的关键字被连续替换了,这样出现的结果是会造成页面的错乱,那么该如何来解决这个问题呢!解决思路如下:
仔细观察我们发现当中是有一定规律的,它们的规律是:class="infotextkey">关键字,所以我们可以利用这个特性来做一下修改,修改如下:
  1. $str='帝国CMS建站管理系统,最安全的网站建设系统';
  2. $keyboard = '帝国CMS建站,帝国CMS,帝国';
  3. $kr = explode(',',$keyboard);
  4. foreach($kr as $v)
  5. {
  6. if(strpos($str,'class="infotextkey">'.$v)==false){
  7. $str=str_replace($v,'[url=http://www.dgmoban.com]'.$v.'[/url]',$str);
  8. }
  9. }
复制代码

它的原理就是,在第二次替换的时候,先检查一下当前关键字是否已经被替换过一次了,如果没有替换过,就替换。
啰嗦了这么多,小白可能不耐烦了,想知道在帝国CMS里该如何操作,答案如下:
1、打开/e/class/functions.php文件,下拉到470行,截图如下:
315ae1b32ff92600128b1a1b061828ec.jpg
换截图中的函数代码替换成如下代码:
  1. //替换关键字 UTF-8版
  2. function ReplaceKey($newstext,$classid=0){
  3.     global $empire,$dbtbpre,$public_r,$class_r;
  4.     if(empty($newstext)||$class_r[$classid]['keycid']==-1){return $newstext;}
  5.     $where='';
  6.     if(!empty($class_r[$classid]['keycid'])){
  7.         $where=" where cid='".$class_r[$classid]['keycid']."'";
  8.     }
  9.     $sql=$empire->query("select keyname,keyurl from {$dbtbpre}enewskey".$where);
  10.     while($r=$empire->fetch($sql)){
  11.         if(strpos($newstext,'class="infotextkey">'.$r[keyname])==false) {
  12.         if (STR_IREPLACE) {
  13.             $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]);
  14.         } else {
  15.             $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]);
  16.         }
  17.         }
  18.     }
  19.     return $newstext;
  20. }
复制代码


红色字体部分就是我们要添加的,这个方法简单有效。最后再补充一点,是针对GBK编码版本的问题,当你在替换的时候会发现一个非常奇怪的问题,举例如下:
  1. $str1='有可';
  2. if (strstr($str1 , '锌')) {
  3.     echo '找到了!';
  4. }else{
  5.     echo '没找到!';
  6. }
复制代码


在GBK编码下做了如下修改://GBK下需要转换编码
  1. //替换关键字 GBK版
  2. function ReplaceKey($newstext,$classid=0){
  3.     global $empire,$dbtbpre,$public_r,$class_r;
  4.     if(empty($newstext)||$class_r[$classid]['keycid']==-1){return $newstext;}
  5.     $where='';
  6.     if(!empty($class_r[$classid]['keycid'])){
  7.         $where=" where cid='".$class_r[$classid]['keycid']."'";
  8.     }
  9.     $sql=$empire->
  10.     query("select keyname,keyurl from {$dbtbpre}enewskey".$where);
  11.     $newstext2 = iconv('GBK','UTF-8',$newstext);
  12.     while($r=$empire->fetch($sql)){
  13.         if (strpos($newstext2 , iconv('GBK','UTF-8',$r[keyname])) !== false) {
  14.             if (strpos($newstext, 'class="infotextkey">' . $r[keyname]) == false) {
  15.                 if (STR_IREPLACE) {
  16.                     $newstext = empty($public_r[repkeynum]) ? str_ireplace($r[keyname], '
  17.                     <a href=' . $r[keyurl] . ' target=_blank class=infotextkey>' . $r[keyname] . '</a>
  18.                     ', $newstext) : preg_replace('/' . $r[keyname] . '/i', '
  19.                     <a href=' . $r[keyurl] . ' target=_blank class=infotextkey>' . $r[keyname] . '</a>
  20.                     ', $newstext, $public_r[repkeynum]);
  21.                 } else {
  22.                     $newstext = empty($public_r[repkeynum]) ? str_replace($r[keyname], '
  23.                     <a href=' . $r[keyurl] . ' target=_blank class=infotextkey>' . $r[keyname] . '</a>
  24.                     ', $newstext) : preg_replace('/' . $r[keyname] . '/i', '
  25.                     <a href=' . $r[keyurl] . ' target=_blank class=infotextkey>' . $r[keyname] . '</a>
  26.                     ', $newstext, $public_r[repkeynum]);
  27.                 }
  28.             }
  29.     }
  30. }
  31. return $newstext;
  32. }
复制代码

至此完毕。


本文转自ECMS模板网,原文连接:http://www.dgmoban.com/shear/114.html  

转载请注明出处

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|PHPIN.NET ( 冀ICP备00000001号 )|网站地图  

GMT+8, 2016-12-6 00:31

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表