题
我有一个模式,其中包含一小部分单词,这些单词用作模式变量中设置的昵称是非法的,如下所示:
$pattern = webmaster|admin|webadmin|sysadmin
使用 preg_match
, ,我怎样才能实现禁止使用这些词的昵称,但注册类似“admin2
“ 或者 ”thesysadmin
“ 被允许?
这是我到目前为止的表达方式:
preg_match('/^['.$pattern.']/i','admin');
// 不应该允许
笔记:用一个 \b
没有多大帮助。
解决方案
根本不使用正则表达式怎么样?
并与 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
你可能不想使用 [
和 ]
:它们的意思是“我们之间的任何字符”,而不是“我们之间的整个字符串”。
并且,作为参考:的手册 预语法 ;-)
其他提示
因此,禁话可以的部分的他们的用户名,但不是整个事情?
在.NET,图案将是:
Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)$")
在“^”字符串的开头匹配,“$”结尾相匹配,所以它在寻找这些字词一个完全匹配。我在相应的PHP语法有点模糊。
不隶属于 StackOverflow