PHP 替换文章关键字,链接 只替换一次2
<?php/**关键词匹配类*@authorylx<ylx@gmail.com>*@packetmipang*使用实例*$str="绿壳蛋鸡撒范德萨下一年adasa,下一年的洒落开房间卢卡斯地方军";*$key=newKeyReplace($str,array("xxxx"=>"<ass>sadf</ass>","下一年"=>'<ass>http://baidu.com</a>',"下一年"=>'<ass>google.com<ass>'));*echo$key->getResultText();*echo$key->getRuntime();*/$str="绿壳蛋鸡撒范德萨下一年adasa,下一年的洒<ahref>下一年</a>落开房间卢卡斯地方军";$k=newKeyWordReplace($str,array("萨下一年adasa"=>'<ahref="google.com">下一年3<ass>',"下一年"=>'<ahref="google.com">下一年2</a>'));echo$k->getResultText();/**关键词匹配类*$str="是是是是是范德萨下一年,下一年谁谁谁水水水水的洒落开是是是是军";*$key=newKeyReplace($str,array("下一年1"=>'http://baidu.com',"下一年"=>'baidu.com'));*echo$key->getResultText();*echo$key->getRuntime();*/classKeyWordReplace{private$keys=array();private$text="";private$runtime=0;private$url=true;private$stopkeys=array();private$all=false;/***@accesspublic*@paramstring$text指定被处理的文章*@paramarray$keys指定字典词组array(key=>url,...)url可以是数组,如果是数组将随机替换其中的一个*@paramarray$stopkeys指定停止词array(key,...)这里面的词将不会被处理*@paramboolean$urltrue表示替换成链接否则只替换*@paramboolean$alltrue表示替换所有找到的词,否则只替换第一次*/publicfunction__construct($text='',$keys=array(),$url=true,$stopkeys=array(),$all=false){$this->keys=$keys;$this->text=$text;$this->url=$url;$this->stopkeys=$stopkeys;$this->all=$all;}/***获取处理好的文章*@accesspublic*@returnstringtext*/publicfunctiongetResultText(){$start=microtime(true);$keys=$this->hits_keys();$keys_tmp=array_keys($keys);functioncmp($a,$b){if(mb_strlen($a)==mb_strlen($b)){return0;}return(mb_strlen($a)<mb_strlen($b))?1:-1;}usort($keys_tmp,"cmp");foreach($keys_tmpas$key){if(is_array($keys[$key])){$url=$keys[$key][rand(0,count($keys[$key])-1)];}else$url=$keys[$key];$this->text=$this->r_s($this->text,$key,$url);}$this->runtime=microtime(true)-$start;return$this->text;}/***获取处理时间*@accesspublic*@returnfloat*/publicfunctiongetRuntime(){return$this->runtime;}/***设置关键词*@accesspublic*@paramarray$keysarray(key=>url,...)*/publicfunctionsetKeys($keys){$this->keys=$keys;}/***设置停止词*@accesspublic*@paramarray$keysarray(key,...)*/publicfunctionsetStopKeys($keys){$this->stopkeys=$keys;}/***设置文章*@accesspublic*@paramstring$text*/publicfunctionsetText($text){$this->text=$text;}/***用来找到字符串里面命中的关键词*@accesspublic*@returnarray$keys返回匹配到的词array(key=>url,...)*/publicfunctionhits_keys(){$ar=$this->keys;$ar=$ar?$ar:array();$result=array();$str=$this->text;foreach($aras$k=>$url){$k=trim($k);if(!$k)continue;if(strpos($str,$k)!==false&&!in_array($k,$this->stopkeys)){$result[$k]=$url;}}return$result?$result:array();}/***用来找到字符串里面命中的停止词*@accesspublic*@returnarray$keys返回匹配到的词array(key,...)*/publicfunctionhits_stop_keys(){$ar=$this->stopkeys;$ar=$ar?$ar:array();$result=array();$str=$this->text;foreach($aras$k){$k=trim($k);if(!$k)continue;if(strpos($str,$k)!==false&&in_array($k,$this->stopkeys)){$result[]=$k;}}return$result?$result:array();}/***处理替换过程*@accessprivate*@paramstring$text被替换者*@paramstring$key关键词*@paramstring$url链接*@returnstring$text处理好的文章*/privatefunctionr_s($text,$key,$url){$tmp=$text;$stop_keys=$this->hits_stop_keys();$stopkeys=$tags=$a=array();if(preg_match_all("#<a[^>]+>[^<]*</a[^>]*>#su",$tmp,$m)){$a=$m[0];foreach($m[0]as$k=>$z){$z=preg_replace("#\##s","\#",$z);$tmp=preg_replace('#'.$z.'#s',"[_a".$k."_]",$tmp,1);}};if(preg_match_all("#<[^>]+>#s",$tmp,$m)){$tags=$m[0];foreach($m[0]as$k=>$z){$z=preg_replace("#\##s","\#",$z);$tmp=preg_replace('#'.$z.'#s',"[_tag".$k."_]",$tmp,1);}}if(!empty($stop_keys)){if(preg_match_all("#".implode("|",$stop_keys)."#s",$tmp,$m)){$stopkeys=$m[0];foreach($m[0]as$k=>$z){$z=preg_replace("#\##s","\#",$z);$tmp=preg_replace('#'.$z.'#s',"[_s".$k."_]",$tmp,1);}}}$key1=preg_replace("#([\#\(\)\[\]\*])#s","\\\\$1",$key);if($this->url)$tmp=preg_replace("#(?!\[_s|\[_a|\[_|\[_t|\[_ta|\[_tag)".$key1."(?!ag\d+_\]|g\d+_\]|\d+_\]|s\d+_\]|_\])#us",$url,$tmp,$this->all?-1:1);else$tmp=preg_replace("#(?!\[_s|\[_a|\[_|\[_t|\[_ta|\[_tag)".$key1."(?!ag\d+_\]|g\d+_\]|\d+_\]|s\d+_\]|_\])#us",$url,$tmp,$this->all?-1:1);if(!empty($a)){foreach($aas$n=>$at){$tmp=str_replace("[_a".$n."_]",$at,$tmp);}}if(!empty($tags)){foreach($tagsas$n=>$at){$tmp=str_replace("[_tag".$n."_]",$at,$tmp);}}if(!empty($stopkeys)){foreach($stopkeysas$n=>$at){$tmp=str_replace("[_s".$n."_]",$at,$tmp);}}return$tmp;}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。