Php 如何使用'preg_match()`匹配用户名
我试图使用Php 如何使用'preg_match()`匹配用户名,php,regex,preg-match,Php,Regex,Preg Match,我试图使用preg_match()验证PHP中的用户名,但我似乎无法按我希望的方式运行。我需要preg\u match()来: 仅接受字符串开头和结尾的字母或数字 接受句点、破折号、下划线、字母、数字 长度必须在5-20个字符之间 如果正则表达式让您感到困惑,您可以始终将字符与正则表达式匹配,然后使用strlen()显式检查字符串的长度 $valid=preg_match('/^[a-zA-Z\d]+[\w.-]*[a-zA-Z\d]$/',$username) strlen($usernam
preg_match()
验证PHP中的用户名,但我似乎无法按我希望的方式运行。我需要preg\u match()
来:
如果正则表达式让您感到困惑,您可以始终将字符与正则表达式匹配,然后使用
strlen()
显式检查字符串的长度
$valid=preg_match('/^[a-zA-Z\d]+[\w.-]*[a-zA-Z\d]$/',$username)
strlen($username)>=5和strlen($username)将需求分解为更小的部分,您将看到它变得更容易:
- 第一个字符必须是1个字母或数字
- 中间字符必须是句点、破折号下划线、字母或数字
- 最后一个字符必须是字母或数字
- 因为第一段和最后一段必须是1个字符,所以中间必须是3到18个字符
您不需要{1}
,因为括号表示匹配集合中的任何一个字符。另外,您需要转义第二组括号中的点,否则它将明显匹配任何字符。@Madbreaks实际上,我认为在这种情况下,句点不必转义。不过这样做肯定没有坏处。至于{1},你是对的,这些都是多余的,但我喜欢把它们放在一边,部分原因是因为我喜欢尽可能简单的表达。谢谢科尔宾,你关于点的看法是正确的-谢谢你指出我的错误@user1307016 Hrmm,字符串是什么?我刚刚测试了21次“a”,结果都是假的。据我所知,重读模式时,不可能匹配超过20个字符(如所需)。你把正则表达式改了吗?如果是的话,改成什么了。不要介意。它就像一个符咒。忘记了$来表示字符串的结尾。我真傻。谢谢你的帮助。你需要在第二组括号中转义这个点,否则它当然会匹配任何字符。
preg_match('/^[a-zA-Z0-9]+[.-_]*[a-zA-Z0-9]{5,20}$/', $username)
$valid = preg_match('/^[a-zA-Z\d]+[\w.-]*[a-zA-Z\d]$/', $username)
AND strlen($username) >= 5 AND strlen($username) <= 20;
if (preg_match('~^[0-9a-z][-_.0-9a-z]{3,18}[0-9a-z]$~i', $username) > 0)
{
// valid
}
~^[a-z0-9]{1}[a-z0-9._-]{3,18}[a-z0-9]{1}$~i