Php 查找一组单词的出现处

Php 查找一组单词的出现处,php,regex,preg-match,Php,Regex,Preg Match,我有一个模式,其中包含一小部分非法用作模式变量中的昵称的单词,如下所示: $pattern = webmaster|admin|webadmin|sysadmin 使用preg\u match,我如何实现禁止使用这些单词的昵称,但允许注册类似“admin2”或“thesysadmin”的内容 这是我到目前为止的表达方式: preg_match('/^['.$pattern.']/i','admin'); //不应该被允许 注意:使用a\b没有多大帮助。那么,禁止使用的单词可以是用户名的一部分

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

$pattern = webmaster|admin|webadmin|sysadmin
使用
preg\u match
,我如何实现禁止使用这些单词的昵称,但允许注册类似“
admin2
”或“
thesysadmin
”的内容

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

preg_match('/^['.$pattern.']/i','admin');
//不应该被允许


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

那么,禁止使用的单词可以是用户名的一部分,但不是全部

在.NET中,模式将是:

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

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

不使用正则表达式怎么样?
与和一起工作

例如,这样做可以:

$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>";
}
鉴于此(相同代码;仅单词更改):

这样,就不必担心找到合适的正则表达式来匹配完整的单词:它只会匹配精确的单词;-)


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

$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>";
}
(我在发布答案后才在正则表达式中看到“
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>";
}
您可能不想使用
[
]
:它们的意思是“我们之间的任何字符”,而不是“我们之间的整个字符串”


并且,作为参考:大土豆手册;-)

!这是一个信息丰富的答复,我会看看你所说的reg exp。在数组中当然是一个非常有效的建议来考虑。再次感谢马丁!作为旁注:在刻痕上使用strtolower控制控件也很有用。括号是必需的。如果没有它们,锚(
^
$
)将分别“粘住”列表中的第一个和最后一个单词。交替(
“|”
)在所有正则表达式运算符中具有最低的优先级。
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
$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