Heim  >  Artikel  >  Backend-Entwicklung  >  敏感词替换算法,效率比str_replace高4倍(附6仟个敏感词)

敏感词替换算法,效率比str_replace高4倍(附6仟个敏感词)

WBOY
WBOYOriginal
2016-07-25 09:08:001455Durchsuche

效率对比(12688个字符,替换1次):
  • str_replace: 0.109937906265秒
  • strtr: 0.0306839942932秒

替换结果对比
  • 比如:「张三」、「张三丰」、「张三丰田」 均为违禁词 (为何会有这样的区分?请参见 「法X」、「法Xgong」)
  • 原文:「我今天开着张三丰田去上班 」
  • strtr:「我今天开着****去上班 」(四个词均替换为了*)
  • str_replace:「我今天开着**丰田去上班 」(仅仅替换了第一个匹配项)
所以使用str_replace替换,是不能本质上解决问题。


时间对比:
关键词数量:6712 (无重复) self init:0.00789093971252(加载xcache) self:0.0354378223419 strtr:0.0311169624329 strtr_array:0.432713985443 str_replace:0.109627008438
  1. require('badword.src.php');
  2. $badword1 = array_combine($badword,array_fill(0,count($badword),'*'));
  3. $bb = '我今天开着张三丰田上班';
  4. $str = strtr($bb, $badword1);
复制代码
  1. //有兴趣的朋友可以研究一下
  2. function strtr_array(&$str,&$replace_arr) {
  3. $maxlen = 0;$minlen = 1024*128;
  4. if (empty($replace_arr)) return $str;
  5. foreach($replace_arr as $k => $v) {
  6. $len = strlen($k);
  7. if ($len if ($len > $maxlen) $maxlen = $len;
  8. if ($len }
  9. $len = strlen($str);
  10. $pos = 0;$result = '';
  11. while ($pos if ($pos + $maxlen > $len) $maxlen = $len - $pos;
  12. $found = false;$key = '';
  13. for($i = 0;$i for($i = $maxlen;$i >= $minlen;--$i) {
  14. $key1 = substr($key, 0, $i); //原文:key[$i] = '\0'
  15. if (isset($replace_arr[$key1])) {
  16. $result .= $replace_arr[$key1];
  17. $pos += $i;
  18. $found = true;
  19. break;
  20. }
  21. }
  22. if(!$found) $result .= $str[$pos++];
  23. }
  24. return $result;
  25. }
复制代码


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:博大精深的 农历算法 Nächster Artikel:简单计算器