Maison  >  Article  >  développement back-end  >  敏感词替换算法,效率比str_replace高4倍(附6仟个敏感词)

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

WBOY
WBOYoriginal
2016-07-25 09:08:001453parcourir

效率对比(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. }
复制代码


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:博大精深的 农历算法 Article suivant:简单计算器