操作步驟:
這個問題看似簡單,做起來卻有些麻煩,我用一種不太聰明的方式實現:
1、把已有的關鍵字連結替換成文字
2、把關鍵字從長至短排列
3、從長至短替換關鍵字為連結,替換的同時尋找有沒有包含其他關鍵字,如果有,把其中子關鍵字替換成{子關鍵字的md5值}
4、把{子關鍵字的md5值}替換回來
<?header("Content-type: text/html; charset=utf-8"); function _sortDesc($a, $b) { return (strlen($a[0]) < strlen($b[0])) ? 1 : -1;}$linkDefs = array( '茶葉,111.htm', '中國茶葉大觀,222.htm',);$linkMap = array();foreach($linkDefs as $row) { $linkMap[] = explode(',', $row);}$str = '這兒是茶葉的連結。<br />這兒是中國茶葉大觀的連結。<br />這兒是<a href="111.html">茶葉</a>的現有連結。<br />這兒是<a href="222.html">中國茶葉大觀</a>的現有連結。<br />';//把原有的連結替換成文字foreach($linkMap as $row) { $str = preg_replace('/(<a.*?>\s*)('.$row[0].')(\s*<\/a>)/sui', $row[0], $str);}//關鍵字從長至短排序usort($linkMap, '_sortDesc');//var_dump($linkMap);$tmpKwds = array(); //存放暫時被替換的子關鍵字foreach($linkMap as $i=>$row) { list($kwd, $url) = $row; for($j=$i+1; $j<count($linkMap); $j++) { $subKwd = $linkMap[$j][0]; //如果包含其他關鍵字,暫時替換成其他字串,如 茶葉 變成 if(strpos($kwd, $subKwd) !== false) { $tmpKwd = ''; $kwd = str_replace($subKwd, $tmpKwd, $kwd); $tmpKwds[$tmpKwd] = $subKwd; } } //把文字替換成連結 $str = preg_replace('/('.$row[0].')/sui', '<a href="'.$row[1].'">'.$kwd.'</a>', $str, -1); // 所有的匹配項都會被替換}//把代替子關鍵字的字串替換回來foreach($tmpKwds as $tmp=>$kwd) { $str = str_replace($tmp, $kwd, $str);}echo $str;?>
函數preg_replace()
參考 http://baike.baidu.com/view/4463003.htm