使用帝國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里該如何操作,答案如下://替換關鍵字 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下需要轉換編碼,具體操作如下:
所以根據他提供的方案,在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,整個教程就說到這,有什么問題請留言!
新聞熱點
疑難解答