ホームページ >バックエンド開発 >PHPチュートリアル >PHP キーワード置換クラス (繰り返しの置換を回避し、元のリンクを保持して復元します)

PHP キーワード置換クラス (繰り返しの置換を回避し、元のリンクを保持して復元します)

WBOY
WBOYオリジナル
2016-07-25 08:57:311172ブラウズ
  1. /*

  2. * キーワード一致クラス
  3. * @author ylx
  4. * @packet mipang
  5. * 使用例
  6. * $str = "来年は緑の殻の産卵鶏がファンデルサールを広げ、その翌年にはルーカス地方軍の部屋を広げます";
  7. * $key = new KeyReplace($str,array("xxxx"=>"sadf", "来年 1" =>'http://baidu.com',"来年" =>'google.com'));
  8. * echo $key->getResultText();
  9. * echo $key ->getRuntime();
  10. */
  11. class KeyReplace
  12. {
  13. private $keys = array();
  14. private $text = "";
  15. private $runtime = 0;
  16. private $url = true;
  17. private $stopkeys = array();
  18. private $all = false;
  19. /**
  20. * @access public
  21. * @param string $text は処理する記事を指定します
  22. * @param array $keys は辞書フレーズを指定します array(key=>url,...) url は配列でも構いませんランダムに置き換えられる配列 そのうちの 1 つ
  23. * @param array $stopkeys はストップワードを指定します array(key,...) この中の単語は処理されません
  24. * @param boolean $url true は、リンク、それ以外の場合のみ置換されます
  25. * @param boolean $all tr​​ue は、見つかったすべての単語を置換することを意味します。それ以外の場合は、最初の単語のみを置換します
  26. */
  27. public function __construct($text='',$keys=array(),$url=true,$stopkeys=array () ,$all=false) {
  28. $this->keys = $keys;
  29. $this->text = $text;
  30. $this->url = $url;
  31. $this->stopkeys = $stopkeys ;
  32. $this->all = $all;
  33. }

  34. /**

  35. * 加工された記事を取得します
  36. * @access public
  37. * @return string text
  38. */
  39. public function getResultText() {
  40. $start = microtime(true);キー = $this->hits_keys();

  41. $keys_tmp = array_keys($keys);

  42. 関数 cmp($a, $b ){

  43. if (mb_strlen($a) == mb_strlen($b)) {
  44. return 0;
  45. }
  46. return (mb_strlen($a) < mb_strlen($b)) 1 : -1;
  47. }< ;/ p>
  48. usort($keys_tmp,"cmp");

  49. foreach($keys_tmp as $key){

  50. $keys[$key])){

  51. $url = $keys[$key][rand(0,count($keys[$key])-1)];
  52. }else
  53. $url = $keys[ $key ];

  54. $this->text = $this->r_s($this->text,$key,$url);

  55. < }
  56. $this->runtime = microtime(true)-$start;

  57. return $this->text;

  58. }
  59. /**
  60. * 処理時間を取得します
  61. * @access public
  62. * @return float
  63. */
  64. public function getRuntime () {

  65. return $this->gt;

  66. }

  67. public function setKeys($keys) {

  68. $this->keys = $keys;

  69. }

  70. /**
  71. * キーワードを設定します
  72. * @access public
  73. * @param array $keys array(key=>url,...)
  74. * /
  75. public function setStopKeys($keys) {

  76. $this->stopkeys = $keys;

  77. }

  78. /**
  79. * ストップワードを設定します
  80. * @access public
  81. * @param array $keys array(key,...)
  82. */
  83. public function setText($text) {

  84. $this->text = $text;

  85. }

  86. *

  87. * 記事を設定します
  88. * @access public
  89. * @param string $text
  90. */
  91. public function Hist_keys(){
  92. $ar = $this->keys;
  93. $ar = $ar?$ar:array();
  94. $result=array();
  95. $ str = $this->text;
  96. foreach($ar as $k=>$url){
  97. $k = トリム($k);
  98. if(!$k)
  99. continue;
  100. if(strpos($ str, $k)!==false && !in_array($k,$this->stopkeys)){
  101. $result[$k] = $url;
  102. }
  103. }
  104. return $result?$result:array( );
  105. }

  106. /**

  107. * 文字列内のヒット ストップ ワードを検索するために使用されます
  108. * @access public
  109. * @return array $keys 一致した単語の array(key,...) を返します
  110. */
  111. public function Hist_stop_keys(){
  112. $ar = $this->stopkeys;
  113. $ar = $ar?$ar:array();
  114. $result=array();
  115. $ str = $this->text;
  116. foreach($ar as $k){
  117. $k = トリム($k);
  118. if(!$k)
  119. continue;
  120. if(strpos($str,$k) !==false && in_array($k,$this->stopkeys)){
  121. $result[] = $k;
  122. }
  123. }
  124. return $result?$result:array();
  125. }
  126. /**

  127. * 置き換え処理を行う
  128. * @access private
  129. * @param string $text 置き換えられた人物
  130. * @param string $key Keyword
  131. * @param string $url リンク
  132. * @return string $text 加工された記事
  133. */
  134. プライベート関数 r_s($text,$key,$url){

  135. $tmp = $text;

  136. $stop_keys = $this->hits_stop_keys();

  137. $stopkeys = $tags = $a = array();

  138. if(preg_match_all("#]+>[^<]*]*># su",$tmp,$m)){
  139. $a=$m[0];

  140. foreach($m[0] as $k=>$z){

  141. $z = preg_replace("###s","#",$z);

  142. $tmp = preg_replace('#'.$z.'#s',"[_a".$k."_]",$tmp,1);

  143. }

  144. };

  145. if(preg_match_all("#<[^>]+>#s",$tmp,$m)){

  146. $tags = $m[0];
  147. foreach($m[0] as $k= >$z){
  148. $z = preg_replace("###s","#",$z);
  149. $tmp = preg_replace('#'.$z.'#s',"[_tag". $k."_]",$tmp,1);
  150. }
  151. }
  152. if(!empty($stop_keys)){
  153. if(preg_match_all("#".implode("|",$stop_keys)."# s",$tmp,$m)){
  154. $stopkeys = $m[0];
  155. foreach($m[0] as $k=>$z){
  156. $z = preg_replace("###s ","#",$z);
  157. $tmp = preg_replace('#'.$z.'#s',"[_s".$k."_]",$tmp,1);
  158. }
  159. }
  160. }
  161. $key1 = preg_replace("#([#()[]*])#s","\\$1",$key);

  162. if($this->url)

  163. $tmp = preg_replace("#(?![_s|[_a|[_|[_t|[_ta|[_tag)".$key1."(?!agd+_ ]|gd+_]|d+_]|sd+_]|_])#us",''.$key.'all?-1:1);
  164. else
  165. $tmp = preg_replace("#(?![_s|[_a|[_|[_t|[_ta|[_tag) ".$key1."(?!agd+_]|gd+_]|d+_]|sd+_]|_])#us",$url,$tmp,$this->all?- 1:1);

  166. if(!empty($a)){

  167. foreach($a as $n=>$at){

  168. $tmp = str_replace("[_a".$n."_]",$at,$tmp);

  169. }

  170. }

  171. if(!empty($tags)){

  172. foreach($tags as $n=>$at){

  173. $tmp = str_replace("[_tag".$n."_]",$at,$tmp);

  174. }

  175. }

  176. if(!empty($stopkeys)){

  177. foreach($stopkeys as $n=>$at){

  178. $tmp = str_replace("[_s".$n."_]",$at,$tmp);

  179. }

  180. }

  181. return $tmp;
  182. }
  183. }

复制幣


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。