ホームページ >バックエンド開発 >PHPチュートリアル >PHP センシティブワードフィルタリング

PHP センシティブワードフィルタリング

WBOY
WBOYオリジナル
2016-07-25 08:44:141045ブラウズ
  1. /**
  2. * 禁止ワードフィルタリング
  3. * 実行効率: 記事あたり 0.05 秒
  4. * @author liuxu
  5. *
  6. */
  7. class Logic_BlackWord
  8. {
  9. const APP_FORUM = 1;
  10. const APP_BLOG = 2;
  11. const APP_VOTE = 3;
  12. /**
  13. * 禁止単語を取得するためのフィルター
  14. * @param 不明 $txt
  15. * @return 曖昧な
  16. */
  17. public function getHitList($txt)
  18. {
  19. $hitList = array();
  20. //对禁词分批过滤
  21. $max = $this->getMax();
  22. if($max)
  23. {
  24. $size = 1000;
  25. $last = ceil($max/$size);
  26. for($page=1;$page<=$last;$page++)
  27. {
  28. $result = $this->getHitListByPage($txt,$ page,$size);
  29. if($result) $hitList = array_merge($hitList,$result);
  30. }
  31. }
  32. $hitList2 = array();
  33. foreach($hitList as $hit=>$type )
  34. {
  35. $hitList2[$type][] = $hit;
  36. }
  37. return $hitList2;
  38. }
  39. プライベート関数 getMax()
  40. {
  41. $redis = Rds::factory();
  42. $memKey = 'blackWord_max';
  43. $max = $redis->get($memKey);
  44. if($max===false)
  45. {
  46. $max = 0;
  47. $blackWord = new Model_BlackWord_BlackWord();
  48. $para[ 'field'] = "MAX(id) AS max";
  49. $result = $blackWord->search($para);
  50. if(isset($result[0]['max'])) $max = $ result[0]['max'];
  51. $redis->setex($memKey,300,$max);
  52. }
  53. return $max;
  54. }
  55. /**
  56. * バッチでフィルタリングして禁止単語を取得します
  57. * @param known $txt
  58. * @param number $page
  59. * @param number $size
  60. * @return multitype:Ambigous
  61. */
  62. private function getHitListByPage($txt,$page=1,$size=1000)
  63. {
  64. $hitList = array();
  65. //分批獲得禁止蠑
  66. $wordTree = $this->getWordTreeByPage($page, $size);
  67. $txt =trip_tags($txt);
  68. $txt = preg_replace('/[^a-zA-Z0-9\x{4e00}-\x{9fa5}]/iu','' ,$txt);
  69. $len = mb_strlen($txt,'UTF-8');
  70. for($i=0;$i {
  71. $char = mb_substr($txt, $i,1,'UTF-8');
  72. if(isset($wordTree[$char]))
  73. {
  74. $result = $this->getHitListByTree(mb_substr($txt,$i,50,'UTF) -8'),$wordTree);
  75. if($result)
  76. {
  77. foreach($result as $hit=>$type)
  78. {
  79. $hitList[$hit] = $type;
  80. }
  81. }
  82. }
  83. }
  84. return $hitList;
  85. }
  86. /**
  87. * 単語を禁止するかどうか
  88. * @param str $txt
  89. * @param arr $wordTree
  90. * @return multitype:unknown
  91. */
  92. プライベート関数 getHitListByTree($txt,&$wordTree)
  93. {
  94. $len = mb_strlen($txt,'UTF-8');
  95. $point = & $wordTree;
  96. $hit = '';
  97. $hitList = array();
  98. for($i=0;$i {
  99. $char = mb_substr($txt) ,$i,1,'UTF-8');
  100. if(isset($point[$char]))
  101. {
  102. $hit .= $char;
  103. $point = & $point[$char];
  104. if(isset($point['type']))//適合成功
  105. {
  106. $hitList[$hit] = $point['type'];
  107. }
  108. }
  109. else
  110. {
  111. Break;
  112. }
  113. }
  114. $hitList を返す;
  115. }
  116. /**
  117. * 禁止単語ツリーをバッチで取得します
  118. * @param int $page
  119. * @param int $size
  120. * @return arr:
  121. */
  122. プライベート関数 getWordTreeByPage($page=1,$size=1000)
  123. {
  124. $redis = Rds::factory();
  125. $memKey = 'blackWord_tree_'.$page.' _'.$size;
  126. $wordTree = $redis->get($memKey);
  127. if($wordTree===false)
  128. {
  129. $wordTree = array();
  130. $blackWord = new Model_BlackWord_BlackWord();
  131. $start = ($page-1)*$size;
  132. $end = $start + $size;
  133. $para['where'] = "status=1 AND id>".$start." AND id<= ".$end;
  134. $result = $blackWord->search($para);
  135. if($result)
  136. {
  137. foreach($result as $value)
  138. {
  139. if($value['word'])
  140. {
  141. $value['word'] = preg_split('/(? $point = & $wordTree;
  142. foreach ($value['word'] as $char)
  143. {
  144. $point = & $point[$char];
  145. }
  146. $point['type'] = $value['type'];
  147. }
  148. }
  149. }
  150. $redis->setex($memKey,300,$wordTree);
  151. }
  152. return $wordTree;
  153. }
  154. }
复制發

PHP


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