浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
一个关键词替换的类,这个类主要用于关键词过滤,或者是关键词查找替换方面,关键词替换,其实就是一个str_replace()的过程
php关键词替换的类(避免重复替换,保留与还原原始链接)
本节主要内容:
一个关键词替换的类
主要可以用于关键词过滤,或关键词查找替换方面。
实现过程分析:
关键词替换,其实就是一个str_replace()的过程,如果是单纯的str_replace面对10W的关键词,1W字的文章也只需要2秒左右。
问题所在:
关键词替换了不只一次,比如a需要替换成a,但结果可能是a等这样。
为此,需要一个方法保护好已经替换了的标签,那么在处理文章之前,就先把标签替换掉比如[_tnum_]在文章处理好了以后再把它还原。
另外一个问题,如果关键字或文章中有[_tnum_]本身怎么办,那么就需要排除这种这里就不能使用str_replace了而需要用到preg_replace用正则来排除。
第三个问题,如果有两个关键字a和ab怎么办,希望先把长的匹配掉,短后匹配,这样就需要在匹配前先排序。
最后一个问题,当str_replace改成了preg_replace以后,变慢了同样一段话10W次匹配要5秒钟,字符串处理的函数中strpos要快一些,那么先用strpos找出关键词即可,10W次查询还不到1秒。就算是100万才道8秒多。
一个关键词匹配替换的类,代码:
代码示例:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 /
关键词匹配类
@authorylx
@packetmipang
使用实例
$str="绿壳蛋鸡撒范德萨下一年,下一年的洒落开房间卢卡斯地方军";
$key=newKeyReplace($str,array("xxxx"=>"sadf","下一年"=>''www.visa158.com'',"下一年"=>''google.com''));
echo$key->getResultText();
echo$key->getRuntime();
/
classKeyReplace
{
private$keys=array();
private$text="";
private$runtime=;
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
/
publicfunctionwww.hunanwang.netgetResultText(){
$start=microtime(true);
$keys=$this->hits_keys();
$keys_tmp=array_keys()($keys);
functioncmp($a,$b){
if(mb_strlen($a)==mb_strlen($b)){
return;
}
return(mb_strlen($a) }
usort($keys_tmp,"cmp");
foreach($keys_tmpas$key){
if(is_array($keys[$key])){
$url=$keys[$key][rand(,count($keys[$key])-)];
}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("#]+>[^<]]>#su",$tmp,$m)){
$a=$m[];
foreach($m[]as$k=>$z){
$z=preg_replace("#\##s","\#",$z);
$tmp=preg_replace(''#''.$z.''#s'',"[_a".$k."_]",$tmp,);
}
};
if(preg_match_all("#<[^>]+>#s",$tmp,$m)){
$tags=$m[];
foreach($m[]as$k=>$z){
$z=preg_replace("#\##s","\#",$z);
$tmp=preg_replace(''#''.$z.''#s'',"[_tag".$k."_]",$tmp,);
}
}
if(!empty($stop_keys)){
if(preg_match_all("#".implode("|",$stop_keys)."#s",$tmp,$m)){
$stopkeys=$m[];
foreach($m[]as$k=>$z){
$z=preg_replace("#\##s","\#",$z);
$tmp=preg_replace(''#''.$z.''#s'',"[_s".$k."_]",$tmp,);
}
}
}
$key=preg_replace("#([\#\(\)\[\]\])#s","\\\\$",$key);
if($this->url)
$tmp=preg_replace("#(?!\[_s|\[_a|\[_|\[_t|\[_ta|\[_tag)".$key."(?!ag\d+_\]|g\d+_\]|\d+_\]|s\d+_\]|_\])#us",''''.$key.'''',$tmp,$this->all?-:);
else
$tmp=preg_replace("#(?!\[_s|\[_a|\[_|\[_t|\[_ta|\[_tag)".$key."(?!ag\d+_\]|g\d+_\]|\d+_\]|s\d+_\]|_\])#us",$url,$tmp,$this->all?-:);
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;
}
}
|
|