我已阅读PHPManual RegEx Intro,但对如何构建preg_match的模式感到困惑。我正在检查登录表单上的用户名是否为全长小写字母,长度为2到5个字符。
模式1 :最初,我使用了一个字符类,后跟一个重复量词:
if (preg_match("[a-z]{2,5}",$_POST['ULusername'])) {
$formmessage = 'Hello, ' . $_POST['ULusername'];
} else {
$formmessage = 'Enter username.';
}
输出始终为“输入用户名。”
模式2 :我想也许我需要分隔符:
if (preg_match("/[a-z]{2,5}/",$_POST['ULusername'])) {
$formmessage = 'Hello, ' . $_POST['ULusername'];
} else {
$formmessage = 'Enter username.';
}
但输出仍然总是“输入用户名。”
模式3 :最后,我尝试使用开头/结尾锚定分隔符:
if (preg_match("#^([a-z]{2,5})$#",$_POST['ULusername'])) {
$formmessage = 'Hello, ' . $_POST['ULusername'];
} else {
$formmessage = 'Enter username.';
}
这给了我想要的输出。
为什么第三种模式有效,但不是前两种?
答案 0 :(得分:0)
第一个模式返回false,表示发生了错误(此处,模式中没有分隔符)。
第二种和第三种模式是有效的正则表达式模式,但它们与同一组字符串不匹配。使用"/[a-z]{2,5}/"
,只要$_POST['ULusername']
包含至少两个连续的小写字符,您就会匹配。但是,它并不关心整个字符串的长度是否大于5。
最后一个模式都有分隔符和开始和结束锚点,因此只有长度为2到5的小写字符串才匹配。
答案 1 :(得分:0)
/[a-z]{2,5}/
仅检查两到五个连续的小写字母。而那里没有输入长度的迹象。尝试使用ABcdEF
,然后您就会了解那里发生了什么。[a-z]{2,5}
对此模式()
进行了分组,并检查该给定字符串是否以此([a-z]{2,5})
组模式开头和结尾。但根据我对你的第三个代码的测试,分组不会影响你的逻辑。不用()
试试,你会得到相同的结果。因为当您对逻辑[a-z]{2,5}
进行分组并检查给定字符串是否以该组开始和结束时与#^[a-z]{2,5}$#
相同。有关更多信息,您可以参考有关正则表达式的教程。