找到一组单词的出现

时间:2009-08-05 17:48:19

标签: php regex preg-match

我有一个带有一小部分单词的模式,这些单词非法用作模式变量中设置的昵称,如下所示:

$pattern = webmaster|admin|webadmin|sysadmin

使用preg_match,我怎样才能实现禁止使用这些词的昵称,但是允许注册“admin2”或“thesysadmin”之类的内容?

这是我到目前为止的表达方式:

preg_match('/^['.$pattern.']/i','admin');

//不应该被允许

注意:使用\b没有多大帮助。

2 个答案:

答案 0 :(得分:3)

根本不使用正则表达式怎么样?
使用explodein_array

例如,这样做:

$pattern = 'webmaster|admin|webadmin|sysadmin';
$forbidden_words = explode('|', $pattern);

它使用|将您的模式分解为数组作为分隔符。


这个:

$word = 'admin';
if (in_array($word, $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

会帮你的

admin is not OK

这个(相同的代码;只有单词更改)

$word = 'admin2';
if (in_array($word, $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

会帮你的

admin2 is OK

这样,无需担心找到正确的正则表达式,以匹配完整单词:它只会匹配确切的单词; - )


修改:一个问题可能是比较区分大小写:-(
使用小写字母处理所有内容将有助于此:

$pattern = strtolower('webmaster|admin|webadmin|sysadmin');  // just to be sure ;-)
$forbidden_words = explode('|', $pattern);

$word = 'aDMin';
if (in_array(strtolower($word), $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

会得到你:

aDMin is not OK

(我在发布答案后才看到正则表达式中的“i”标志;因此,必须对其进行编辑)


编辑2:,如果你真的想用正则表达式做,你需要知道:

  • ^标记字符串的开头
  • $标记字符串的结尾

所以,这样的事情应该做:

$pattern = 'webmaster|admin|webadmin|sysadmin';

$word = 'admin';
if (preg_match('#^(' . $pattern . ')$#i', $word)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

$word = 'admin2';
if (preg_match('#^(' . $pattern . ')$#i', $word)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

括号可能没有必要,但我喜欢用它们来隔离我想要的东西。

而且,你会得到同样的输出:

admin is not OK

admin2 is OK

您可能不想使用[]:它们的意思是“我们之间的任何字符”,而不是“我们之间的整个字符串”。

并且,作为参考:preg syntax的手册; - )

答案 1 :(得分:0)

那么,禁用的单词可以是部分的用户名而不是整个用户?

在.NET中,模式为:

 Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)$")

“^”匹配字符串的开头,“$”匹配结尾,因此它正在寻找其中一个单词的完全匹配。我对相应的PHP语法有点模糊。