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