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

$pattern = webmaster|admin|webadmin|sysadmin

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

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

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

// 不应该允许

笔记:用一个 \b 没有多大帮助。

有帮助吗?

解决方案

根本不使用正则表达式怎么样?
并与 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

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

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

其他提示

因此,禁话可以的部分的他们的用户名,但不是整个事情?

在.NET,图案将是:

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

在“^”字符串的开头匹配,“$”结尾相匹配,所以它在寻找这些字词一个完全匹配。我在相应的PHP语法有点模糊。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top