在用户名中搜索“坏名称”的最有效方法

时间:2012-04-18 01:59:12

标签: php regex

我有一个我正在开发的应用程序,用户可以为自己选择一个名称。我需要能够过滤掉“坏”名称,所以我现在就这样做了:

$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这样的数组中),并搜索用户的名字以查看该单词是否在他们的名字内。我对正则表达式并不是很好,我能想到的唯一方法就是把它全部放在一个效率非常低效的循环中。谁有更好的主意?我想我需要弄清楚如何使用数组搜索字符串。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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;
  }

这对我很有用