Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用'preg_match()`匹配用户名_Php_Regex_Preg Match - Fatal编程技术网

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()
来:

  • 仅接受字符串开头和结尾的字母或数字
  • 接受句点、破折号、下划线、字母、数字
  • 长度必须在5-20个字符之间

  • 如果正则表达式让您感到困惑,您可以始终将字符与正则表达式匹配,然后使用
    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