재인쇄: http://www.169it.com/blog_article/601549531.html
이 섹션의 주요 내용:
키워드 대체 클래스
를 주로 사용할 수 있습니다. 키워드 필터링 또는 키워드 검색 및 교체.
구현 프로세스 분석:
키워드 교체는 실제로 str_replace() 프로세스입니다. 간단한 str_replace가 10W 키워드에 직면하면 1W 단어로 구성된 기사는 약 2초만 소요됩니다.
문제:
키워드가 두 번 이상 바뀌었습니다. 예를 들어 a를 a로 바꿔야 하는데 결과는 a<일 수 있습니다. ;/a>< /a>이렇게 기다리세요.
이 때문에 교체된 태그를 보호하는 방법이 필요하며, 그런 다음 기사를 처리하기 전에 [_tnum_]과 같은 태그를 먼저 교체하고 기사가 처리된 후에 복원해야 합니다.
또 다른 질문입니다. 키워드나 기사에 [_tnum_] 자체가 있으면 이를 제외해야 합니다. 여기서는 str_replace를 사용할 수 없지만 정규식으로 제외하려면 preg_replace를 사용해야 합니다.
세 번째 질문은 a와 ab라는 두 개의 키워드가 있으면 긴 것을 먼저 일치시킨 다음 짧은 것을 일치시키는 방식으로 정렬해야 합니다.
마지막 질문, str_replace를 preg_replace로 변경하면 속도가 느려지고 같은 문단을 10만 번 일치시키는 데 5초가 걸렸습니다. 문자열 처리 기능 중에서는 strpos가 더 빠르므로 먼저 strpos를 사용하여 키를 찾으세요. 단어 한 개면 충분하며, 100,000개의 쿼리에는 1초도 채 걸리지 않습니다. 100만개라고 해도 8초 이상이 걸립니다.
키워드 일치 대체 클래스, 코드:
코드 예:
/*
* 키워드 일치 class
* @author ylx
* @packet mipang
* 사용 예
* $str = "녹색조개 산란계, 반데사르 내년, 다음해 1년차에는 Lucas Local Army 방이 열립니다.";
* $key = new KeyReplace($str,array("xxxx"=>"sadf","next year 1"=> 'http://baidu .com',"Next year"=>'google.com'));
* echo $key->getResultText();
* echo $key-> getRuntime();
*/
class KeyReplace
{
private $keys = array();
private $text = "";
private $runtime = 0;
private $url = true;
비공개 $stopkeys = array();
비공개 $all = false;
/**
* @access public
* @param string $text는 처리할 기사를 지정합니다.
* @param array $keys는 사전 구문을 지정합니다. array(key=>url,...) url은 다음과 같습니다. 배열, 배열이면 그 중 하나가 무작위로 교체됩니다
* @param array $stopkeys는 중지 단어를 지정합니다 array(key,...) 이 안에 있는 단어는 처리되지 않습니다
* @ param boolean $url true는 링크로의 교체를 나타냅니다. 그렇지 않으면
만 교체합니다. * @param boolean $all true는 발견된 모든 단어를 교체한다는 의미이고, 그렇지 않으면 첫 번째
만 교체한다는 의미입니다.*/
공개 함수 __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;
}
/**
* 처리된 기사 가져오기
* @access public
* @return 문자열 텍스트
*/
공용 함수 getResultText() {
$start = microtime(true);
$keys = $this->hits_keys();
$keys_tmp = array_keys()( $keys);
함수 cmp($a, $b){
if (mb_strlen($a) == mb_strlen($b)) {
return 0;
}
return (mb_strlen($a) < mb_strlen($b)) ? 1 : -1;
}
usort($keys_tmp,"cmp")
foreach ($keys_tmp를 $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;
}
/**
* 처리 시간 가져오기
* @access public
* @return float
*/
공용 함수 getRuntime() {
return $this->runtime;
}
/**
* 키워드 설정
* @access public
* @param array $keys array(key=>url,...)
*/
공개 함수 setKeys($keys) {
$this->keys = $keys;
}
/* *
* 중지 단어 설정
* @access public
* @param array $keys array(key,...)
*/
공개 함수 setStopKeys($keys) {
$this->stopkeys = $keys;
}
/**
* 기사 설정
* @access public
* @param string $text
* /
공개 함수 setText($text) {
$this->text = $text;
}
/**
* 문자열에서 히트 키워드를 찾는 데 사용됩니다.
* @access public
* @return array $keys 일치하는 단어 배열을 반환합니다(key=>url,...)
*/
공개 함수 hit_keys(){
$ar = $this->keys;
$ar = $ar?$ar:array();
$result=array();
$str = $this->text;
foreach($ar as $k=>$url){
$k = Trim($k);
if(!$k)
계속;
if(strpos($str,$k)!==false && !in_array($k,$this->stopkeys)){
$result[$k] = $url;
}
}
return $result?$result:array();
}
/**
* 문자열에서 히트 중지 단어를 찾는 데 사용됩니다.
* @access public
* @return array $keys 일치하는 단어 배열(key,...)을 반환합니다.
*/
공개 함수 hit_stop_keys(){
$ar = $this->stopkeys;
$ar = $ar?$ar:array();
$result=array();
$str = $this->text;
foreach($ar as $k){
$k = Trim($k);
if(!$k)
continue;
if(strpos($str,$k) )!==false && in_array($k,$this->stopkeys)){
$result[] = $k;
}
}
$result?$result:array 반환 ();
}
/**
* 교체 프로세스 처리
* @access private
* @param string $text 대체된 사람
* @param string $key 키워드
* @param string $url link
* @return string $text 처리된 기사
*/
비공개 함수 r_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[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] $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."( ?!agd _]|gd _]|d _]|sd _]|_])#us",''.$key.' a>',$tmp,$this->all?-1:1);
else
$tmp = preg_replace("#(?![_s|[_a|[_|[_t|[ _ta|[_tag)".$key1."(?!agd _]|gd _]|d _]|sd _]|_])#us",$url,$tmp,$this->all? -1:1);
if(!empty($a)){
foreach($a as $n=>$at){
$tmp = str_replace("[_a".$n."_]",$at,$tmp);
}
}
if(!empty($tags)){
foreach($tags as $n=>$at){
$tmp = str_replace("[_tag".$n."_]",$at,$tmp) ;
}
}
if(!empty($stopkeys)){
foreach($stopkeys as $n=>$at){
$tmp = str_replace("[_s".$n."_]",$at,$tmp);
}
}
return $tmp;
}
}
以上就介绍了php关键词替换的类避免重复替换,保留与还接,包括了方词内容,希望对PHP教程有兴趣的朋友有所帮助。