2012-04-18 14 views
2

私は開発しているアプリケーションを持っています。ユーザーは自分で名前を選択できます。私は「悪い」の名前をフィルタリングできるようにする必要がありますので、私は今のところ、この操作を行います。ユーザー名の「悪い名前」を検索する最も効率的な方法

$error_count=0; 

$bad_names="badname1badname2"; 

preg_match_all("/\b".$user_name."\b/i",$global['bad_names'], 
    $matches,PREG_OFFSET_CAPTURE); 

if(count($matches[0])>0) 
{ 
    $error_count++; 
} 

ユーザーの名前が悪い名前のリストの中にあった場合、これは私に言うだろう、しかし、それは私に教えてくれありません悪意のある名前自体がユーザーの名前である場合彼らは悪い言葉を他のものと組み合わせることができ、私はそれを検出しません。

私はこれにどのような種類の正規表現を使用しますか?悪い名前(好ましくは$ bad_namesのような配列)を取り、ユーザの名前を検索して、その単語が名前の範囲内にあるかどうかを調べる必要があります。私は正規表現ではあまり良くありません。私が考えることができる唯一の方法は、すべてをループ全体に渡すことです。これは非常に非効率的です。誰でも良い考えがありますか?配列で文字列を検索する方法を理解する必要があると思います。

+0

のために素晴らしい作品:私は便利な漫画/記事を読んでいるP – Phillip

+0

どこかをどのように単純な "悪い言葉"のフィルタリングが物事を混乱させ、無害な言葉を捕まえることができるかについて。もちろん、今私はそれを見つけることはできません。 –

+1

@SurrealDreams [Clbuttic Mistake](http://www.telegraph.co.uk/news/newstopics/howaboutthat/2667634/The-Clbuttic-Mistake-When-obscenity-filters-go-wrong.html) –

答えて

1
$badnames = array('name1', 'name2'); 

// you need to quote the names so they can be inserted into the 
// regular expression safely 
$badnames_quoted = array(); 
foreach ($badnames as $name) { 
    $badnames_quoted[] = preg_quote($name, '/'); 
} 

// now construct a RE that will match any bad name 
$badnames_re = '/\b('.implode('|', $badnames_quoted).')\b/Siu'; 

// no need to gather all matches, or even to see what matched 
$hasbadname = preg_match($badnames_re, $thestring); 
if ($hasbadname) { 
    // bad name found 
} 
+0

うーん、私はそれを働かせた。/bを削除する必要があります。 – Phillip

0
private static $bad_name = array("word1", "word2", "word3"); 
private static $forbidden_name = array (array of unwanted character strings) 

private static function userNameValid($name_in) { 
    $badFound = preg_match("/\b(" . implode(self::$bad_name,"|") . ")\b/i", $name_in); // checks array for exact match 
    $forbiddenFound = preg_match("/(" . implode(self::$forbidden_name,"|") . ")/i", $name_in); // checks array for any character match with a given name (i.e. "ass" would be found in assassin) 

    if ($badFound) { 
    return FALSE; 
    } elseif ($forbiddenFound) { 
    return FALSE; 
    } else { 
    return TRUE; 
    } 

これはmellamokb私はコード行を置くために私のポストを編集しようとしましたが、あなたはそれに私を打つ私

関連する問題