Heim >Backend-Entwicklung >PHP-Tutorial >Die PHP-Schlüsselwort-Ersetzungsklasse vermeidet wiederholtes Ersetzen, behält den ursprünglichen Link bei und stellt ihn wieder her
Nachdruck: http://www.169it.com/blog_article/601549531.html
Der Hauptinhalt dieses Abschnitts:
Eine Schlüsselwort-Ersetzungsklasse
kann hauptsächlich verwendet werden Schlüsselwortfilterung oder Schlüsselwortsuche und -ersetzung.
Analyse des Implementierungsprozesses:
Das Ersetzen von Schlüsselwörtern ist eigentlich ein str_replace()-Prozess. Wenn ein einfacher str_replace mit 10 W-Schlüsselwörtern konfrontiert wird, dauert ein Artikel mit 1 W-Wörtern nur etwa 2 Sekunden.
Das Problem:
Das Schlüsselwort wird mehr als einmal ersetzt. Beispielsweise muss a durch a ersetzt werden, aber das Ergebnis kann a< sein ;/a>< /a>Warte so.
Aus diesem Grund ist eine Methode erforderlich, um die ersetzten Tags zu schützen. Ersetzen Sie dann vor der Verarbeitung des Artikels zuerst das Tag, z. B. [_tnum_], und stellen Sie es dann wieder her, nachdem der Artikel verarbeitet wurde.
Noch eine Frage: Was ist, wenn [_tnum_] selbst im Schlüsselwort oder Artikel enthalten ist? Dann kann str_replace hier nicht verwendet werden, aber preg_replace muss verwendet werden, um es mit regulären Ausdrücken auszuschließen.
Die dritte Frage ist: Was ist, wenn es zwei Schlüsselwörter gibt, a und ab? Ich hoffe, zuerst die langen und dann die kurzen zuzuordnen. Auf diese Weise muss ich sie vor dem Abgleich sortieren.
Letzte Frage: Als str_replace in preg_replace geändert wurde, wurde es langsamer und es dauerte 5 Sekunden, bis derselbe Absatz 100.000 Mal abgeglichen wurde. Unter den Zeichenfolgenverarbeitungsfunktionen ist strpos schneller. Verwenden Sie daher zuerst strpos, um den Schlüssel zu finden Ein einziges Wort reicht aus und 100.000 Abfragen dauern weniger als 1 Sekunde. Selbst wenn es 1 Million ist, dauert es mehr als 8 Sekunden.
Eine Keyword-Matching-Ersetzungsklasse, Code:
Codebeispiel:
/*
* Keyword-Matching Klasse
* @author ylx
* @packet mipang
* Verwendungsbeispiele
* $str = "Grünschalige Legehenne, Van der Sar nächstes Jahr, das nächste Jahr 1 wird den Raum Lucas Local Army öffnen";
* $key = new KeyReplace($str,array("xxxx"=>"sadf","next year 1"=> 'http://baidu .com',"Nächstes Jahr"=>'google.com'));
* echo $key->getResultText();
* echo $key-> getRuntime();
*/
class KeyReplace
{
private $keys = array();
private $text = "";
private $runtime = 0;
private $url = true;
private $stopkeys = array();
private $all = false;
/**
* @access public
* @param string $text gibt den zu verarbeitenden Artikel an
* @param array $keys gibt die Wörterbuchphrase array(key=>url,...) an, die URL sein kann ein Array. Wenn es sich um ein Array handelt, wird eines davon zufällig ersetzt
* @param array $stopkeys gibt die Stoppwörter an array(key,...) Die Wörter darin werden nicht verarbeitet
* @ param boolean $url true bedeutet Ersetzen in einem Link, andernfalls nur Ersetzen
* @param boolean $all true bedeutet Ersetzen aller gefundenen Wörter, andernfalls nur Ersetzen des ersten
*/
public function __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;
}
/**
* Verarbeitete Artikel abrufen
* @access public
* @return string text
*/
öffentliche Funktion getResultText() {
$start = microtime(true);
$keys = $this->hits_keys();
$keys_tmp = array_keys()( $keys);
function 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 as $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;
}
/**
* Bearbeitungszeit abrufen
* @access public
* @return float
*/
öffentliche Funktion getRuntime() {
return $this->runtime;
}
/**
* Schlüsselwörter festlegen
* @access public
* @param array $keys array(key=>url,...)
*/
öffentliche Funktion setKeys($keys) {
$this->keys = $keys;
}
/* *
* Stoppwörter setzen
* @access public
* @param array $keys array(key,...)
*/
öffentliche Funktion setStopKeys($keys) {
$this->stopkeys = $keys;
}
/**
* Artikel festlegen
* @access public
* @param string $text
* /
öffentliche Funktion setText($text) {
$this->text = $text;
}
/**
* Wird verwendet, um das Trefferschlüsselwort in der Zeichenfolge zu finden
* @access public
* @return array $keys Gibt das übereinstimmende Wortarray (key=>url,...) zurück
*/
öffentliche Funktion hits_keys(){
$ar = $this->keys;
$ar = $ar?$ar:array();
$result=array();
$str = $this->text;
foreach($ar as $k=>$url){
$k = trim($k);
if(!$k)
continue;
if(strpos($str,$k)!==false && !in_array($k,$this->stopkeys)){
$result[$k] = $url;
{ > $ar = $this->stopkeys;
$ar = $ar?$ar:array();
$result=array();
$str = $this->text;
$k = trim($k);
if(!$k)
continue;
if(strpos($str,$k )!==false && in_array($k,$this->stopkeys)){
$result[] = $k;
}
}
return $result?$result:array ();
}
/**
* Wird verwendet, um das Hit-Stop-Wort in der Zeichenfolge zu finden
* @access public
* @return array $keys Gibt das übereinstimmende Wortarray (Schlüssel,...) zurück
*/
private function 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] as $k=>$z){
$z = preg_replace("###s","#",$z);
$tmp = preg_replace('#'.$z .'#s',"[_tag".$k."_]",$tmp,1);
}
if(!empty($stop_keys)){
$stopkeys = $m[0];
foreach($m[ 0] as $k=>$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教程有兴趣的朋友有所帮助.