APIからキーワードをひっぱってきて、
NGワードがあると表示しない・・というものを作っています。
NGワードを配列にして・・
$ngword = explode(",", "ダメ,NG,禁止・・
whileで回して1つ1つifとstrstrで判定しています。
if (strstr($apiword, $ngword[$a])!=""){・・
で、なんか無駄に時間がかかっているような気がします。
もっと軽くするにはどうすればいいですか?
正規表現を使う方法が考えられます。
http://www.php.net/manual/ja/book.pcre.php
NGワードを選択子メタ文字 "|" でつないだ以下のような正規表現パターンを作り、対象となるキーワードとマッチさせれば良いのです。
/NGワード1|NGワード2|NGワード3/ // "NGワード1" または "NGワード2" または "NGワード3" どれかに一致する
簡単に書くと
$ngpattern=""; for($i=0;$i<count($ngword);$i++){ if($i>0){ $ngpattern.="|"; } $ngpattern.=$ngword[$i]; } $f=preg_match("/".$ngpattern."/",$apiword); // $apiwordにNGワードのどれかが含まれていれば $fは1 含まれていなければ $fは0 となる
ただしNGワードに正規表現のメタ文字が含まれている場合は、正規表現パターンを生成するときに適切にエスケープしなければなりません。
$apiword に絶対含まれない文字をデリミタにした $ngword_list を作り、それと比較するのはどうでしょう。
たとえば、"\r" が絶対含まれないのであれば、
$ngword_list = "ダメ\rNG\r禁止\r...";
として、$apiword が存在するか比較するとか。
この方法は簡単ではありますが、線形で探すのであまり速くありません。
NG ワードを探すのが前方一致や後方一致に限られるのであれば簡単な速い検索方法があるかもしれません。
部分一致が必要なのであれば、高速化には全文検索ライブラリが必要になってくるかと思います。
まず、現在のコードでの問題点を考えてみました。
の2点を加えたコードをつくってみました。
$ngword = explode(",", "ダメ,NG,禁止"); foreach ($ngword as $word){ if (strpos($word, $apiword) !== false){ // 表示しない処理をして終了 break; } }
もし、これで速度に大差がないようであれば、正規表現を使ったやり方もあります。
『,』で区切るのではなく『|』で区切った文字列で検索します。
$strword = "ダメ|NG|禁止"; if (preg_match("[" . quotemeta($strword) . "]", $apiword)){ // 表示しない処理 }
コメント(0件)