1

我有一个模式,其中包含一些非法用作在模式变量中设置的昵称的单词,如下所示:

$pattern = webmaster|admin|webadmin|sysadmin

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

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

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

// 不应该被允许

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

4

2 回答 2

3

根本不使用正则表达式怎么办?
并与explode和一起工作in_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

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

并且,作为参考:preg 语法手册;-)

于 2009-08-05T17:54:14.683 回答
0

那么,禁用词可以是他们用户名的一部分,而不是全部?

在 .NET 中,模式将是:

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

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

于 2009-08-05T17:53:01.613 回答