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 のような配列) を取得し、ユーザーの名前を検索して、その単語が名前に含まれているかどうかを確認できるようにする必要があります。私は正規表現が得意ではありません。私が考えることができる唯一の方法は、非常に非効率的なループにすべてを通すことです。誰でも良いアイデアがありますか?配列を使用して文字列を検索する方法を理解する必要があると思います。

4

2 に答える 2

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
}
于 2012-04-18T02:10:30.987 に答える
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;
  }

これは私にとって素晴らしい作品です

于 2012-04-18T02:28:18.200 に答える