人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpについての質問です。

APIからキーワードをひっぱってきて、
NGワードがあると表示しない・・というものを作っています。

NGワードを配列にして・・
$ngword = explode(",", "ダメ,NG,禁止・・

whileで回して1つ1つifとstrstrで判定しています。
if (strstr($apiword, $ngword[$a])!=""){・・

で、なんか無駄に時間がかかっているような気がします。
もっと軽くするにはどうすればいいですか?

●質問者: にらたま
●カテゴリ:インターネット ウェブ制作
✍キーワード:API ng NGワード PHP キーワード
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● nagase
●27ポイント

正規表現を使う方法が考えられます。

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ワードに正規表現のメタ文字が含まれている場合は、正規表現パターンを生成するときに適切にエスケープしなければなりません。

http://www.php.net/manual/ja/regexp.reference.php


2 ● ゆーの
●27ポイント

$apiword に絶対含まれない文字をデリミタにした $ngword_list を作り、それと比較するのはどうでしょう。

たとえば、"\r" が絶対含まれないのであれば、

$ngword_list = "ダメ\rNG\r禁止\r...";

として、$apiword が存在するか比較するとか。

この方法は簡単ではありますが、線形で探すのであまり速くありません。

NG ワードを探すのが前方一致や後方一致に限られるのであれば簡単な速い検索方法があるかもしれません。

部分一致が必要なのであれば、高速化には全文検索ライブラリが必要になってくるかと思います。


3 ● hard
●26ポイント

まず、現在のコードでの問題点を考えてみました。

の2点を加えたコードをつくってみました。

$ngword = explode(",", "ダメ,NG,禁止");

foreach ($ngword as $word){
if (strpos($word, $apiword) !== false){
// 表示しない処理をして終了
break;
}
}

もし、これで速度に大差がないようであれば、正規表現を使ったやり方もあります。

『,』で区切るのではなく『|』で区切った文字列で検索します。

$strword = "ダメ|NG|禁止";

if (preg_match("[" . quotemeta($strword) . "]", $apiword)){
// 表示しない処理
}
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ