ホームページ  >  記事  >  バックエンド開発  >  機密単語置換アルゴリズム、str_replace より 4 倍効率的 (6,000 個の機密単語が添付)

機密単語置換アルゴリズム、str_replace より 4 倍効率的 (6,000 個の機密単語が添付)

WBOY
WBOYオリジナル
2016-07-25 09:08:001453ブラウズ

効率比較 (12688 文字、1 置換):
  • str_replace: 0.109937906265 秒
  • strtr: 0.0306839942932 秒

交換結果の比較
  • 例: 「Zhang San」、「Zhang Sanfeng」、「Zhang San Toyota」はすべて禁止用語です (なぜそのような区別があるのですか?「法X」、「法Xgong」を参照してください)
  • 原文: 「今日はホンダ・トヨタを運転して仕事に行きました」
  • strtr: 「今日は****を運転して仕事に行きました」 (4つの単語すべてを*に置き換えます)
  • str_replace: "今日**トヨタを運転して仕事に行きました" (最初の一致のみが置き換えられました)
したがって、str_replace を使用して置換しても、本質的に問題を解決することはできません。


時間の比較:
キーワード数:6712(重複なし) 自己初期化:0.00789093971252 (xcache のロード) 自分: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 < $minlen) $minlen = $len;
  9. }
  10. $len = strlen($str);
  11. $pos = 0;$result = '';
  12. while ($pos < ; $ len) {
  13. if ($pos + $maxlen > $len) $maxlen = $len - $pos;
  14. $found = false;$key = '';
  15. for($i = 0;$i for($i = $maxlen;$i >= $ minlen;--$i) {
  16. $key1 = substr($key, 0, $i); //原文: key[$i] = '
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。