我有一个带有一小部分单词的模式,这些单词非法用作模式变量中设置的昵称,如下所示:
$pattern = webmaster|admin|webadmin|sysadmin
使用preg_match
,我怎样才能实现禁止使用这些词的昵称,但是允许注册“admin2
”或“thesysadmin
”之类的内容?
这是我到目前为止的表达方式:
preg_match('/^['.$pattern.']/i','admin');
//不应该被允许
注意:使用\b
没有多大帮助。
答案 0 :(得分: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
您可能不想使用[
和]
:它们的意思是“我们之间的任何字符”,而不是“我们之间的整个字符串”。
并且,作为参考:preg syntax的手册; - )
答案 1 :(得分:0)
那么,禁用的单词可以是部分的用户名而不是整个用户?
在.NET中,模式为:
Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)$")
“^”匹配字符串的开头,“$”匹配结尾,因此它正在寻找其中一个单词的完全匹配。我对相应的PHP语法有点模糊。