>백엔드 개발 >PHP 튜토리얼 >PHP 키워드 교체 클래스는 반복적인 교체를 방지하고 원래 링크를 유지 및 복원합니다.

PHP 키워드 교체 클래스는 반복적인 교체를 방지하고 원래 링크를 유지 및 복원합니다.

WBOY
WBOY원래의
2016-07-29 09:14:511075검색

재인쇄: 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.'',$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教程有兴趣的朋友有所帮助。