Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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 用于验证用户名的正则表达式_Php_Regex - Fatal编程技术网

Php 用于验证用户名的正则表达式

Php 用于验证用户名的正则表达式,php,regex,Php,Regex,我试图理解这个正则表达式模式的错误: '/^[a-z0-9-\.]*[a-z0-9]+[a-z0-9-\.]*{4,20}$/i' 我要做的是验证用户名。允许的字符有字母数字、破折号、下划线和点。我试图实现的限制是至少有一个字母数字字符,这样用户就不允许有这样的昵称:\uu-。 我现在使用的功能是: function validate($pattern, $string){ return (bool) preg_match($pattern, $string); } 谢谢 编辑 正如@

我试图理解这个正则表达式模式的错误:

'/^[a-z0-9-\.]*[a-z0-9]+[a-z0-9-\.]*{4,20}$/i'

我要做的是验证用户名。允许的字符有字母数字、破折号、下划线和点。我试图实现的限制是至少有一个字母数字字符,这样用户就不允许有这样的昵称:
\uu-。

我现在使用的功能是:

function validate($pattern, $string){
    return (bool) preg_match($pattern, $string);
}
谢谢

编辑

正如@mario所说,是的,
*{4,20}
有一个问题。 我现在想做的是添加
()
,但不例外:

'/^([a-z0-9-\.]*[a-z0-9]+[a-z0-9-\.]*){4,20}$/i'

现在它与'aa--aa'匹配,但与'aa--'和'--aa'不匹配。 还有其他建议吗

编辑

也许有人想否认像“...-a”这样不好看的用户名。 此正则表达式将拒绝具有连续的非字母数字字符:

/^(?=.{4,20}$)[a-z0-9]{0,1}([a-z0-9.-][a-z0-9]+)*[a-z0-9.-{0,1}$/i

在这种情况下,
\u这是我-
将不匹配,但
\u这是我
将匹配


祝您度过愉快的一天,感谢所有人:)

这可能只是微调的问题,您可以尝试以下方法:

if (preg_match('/^[a-zA-Z0-9]+[_.-]{0,1}[a-zA-Z0-9]+$/m', $subject)) {
    # Successful match
} else {
    # Match attempt failed
}
匹配项:

  • a_b试试这个:

    '/[a-z0-9-_\.]*[a-z0-9]{1,20}[a-z0-9-_\.]*$/i'
    
    试试这个:

    ^[a-zA-Z][-\w.]{0,22}([a-zA-Z\d]|(?<![-.])_)$
    
    ^[a-zA-Z][-\w.]{0,22}([a-zA-Z\d]|(?
    
    从相关问题:

    我很清楚,您应该将此拆分为两张支票

    首先检查他们是否使用了所有有效字符。如果他们没有,那么你可以告诉他们使用了无效字符

    然后检查它们是否至少有一个字母数字字符。如果没有,则可以告诉它们必须


    这里有两个明显的优点:给用户更有意义的反馈,以及更清晰的代码阅读和维护。

    不要试图将其全部塞进一个正则表达式中。让您的生活更简单,并使用两步方法:

    return (bool)
     preg_match('/^[a-z0-9_.-]{4,20}$/', $s) && preg_match('/\w/', $s);
    
    正则表达式中的错误可能是
    *
    {n,m}
    的混合。这些量词中只能有一个,而不是
    *{4,20}


    很好,下面是您想要的麻烦解决方案:

     preg_match('/^(?=.{4})(?!.{21})[\w.-]*[a-z][\w-.]*$/i', $s)
    

    断言断言长度,第二部分确保至少有一个字母存在。

    这里有一个简单的单一正则表达式解决方案(详细):

    $re='/#匹配至少有一个alphanum的密码。
    ^#锚定至管柱起点。
    (?=..[A-Za-z0-9])#至少一个字母编号。
    [\w\-.]{4,20}#匹配4到20个有效字符。
    \z#锚定在绳子的末端。
    /x′;
    
    行动中(简称):

    函数验证($string){
    $re='/^(?=.*A[A-Za-z0-9])[\w\-.]{4,20}\z/';
    返回(bool)预匹配($re,$string);
    }
    
    这将验证用户名

  • 从阿尔法开始
  • 接受下划线破折号和点
  • 不允许有空格
  • 你为什么不这样简单点?
    ^[a-zA-Z][a-zA-Z0-9\.[3,9}

    • 第一个字母应该按字母顺序排列
    • 然后后跟允许的字符或符号
    • 单词的长度应在4,10之间(明确强制第一个单词)


    你试过用类似的方法调试吗?谢谢你的建议。我会给它一个精打细算的人可能会认为它是一个逃避,但对于这样的事情(很容易表达没有正则表达式)我个人更喜欢在正则表达式中保持清醒。为什么不循环检查字符,检查它们是否都是有效字符,至少有一个是字母数字?可能是因为你使用的是小写字母a-z,并且总是以大写字母开头写用户名?你能发布一些示例数据吗?@mightyuhu的说法是正确的“从0到无限次”和“从4到20次”"这是非法语法实际上我是说它应该从字符串开始匹配。把^放在方括号内会有否定的效果。而且,正如我说的,我不仅要匹配字母数字,还要匹配更多的字符。问题是要否认至少缺少一个字母数字字符。是的,我的错,我注意到我我的回答不够清楚,于是编辑了它。事实上,在看到这一点后,我喜欢IDEA否认有更多的
    -
    -
    一起:)最后一个IDEA会处理这个:
    /^(?=.{4,20}$)[a-z0-9]{0,1}([a-z0-9.-][a-z0-9]+*)*[a-z0-9.-{0,1$/I<我说过不要以字母或数字开头,你的正则表达式实际上是什么,但至少要包含一个字母或数字,这就是为什么我把[a-z0-9]+在midle中。是的,这会起作用,剩下的唯一问题是检查用户名的长度。什么时候
    strlen
    是不可能的?因为我使用的是带有模式的类。作为第一步,检查用户名是否以字母开头,这不正是我要做的。这会增加复杂性。是的,这会增加复杂性现在还不是世界末日,但这并不是真的需要一个复杂的正则表达式来分割它。正如我之前所说,我有一个包含模式的类验证器,我真的不想让事情复杂化,并在那里实现两步验证。@s3v3n:我尊重地不同意。这将消除复杂性。你已经把事情复杂化了事实证明,您的正则表达式并没有达到您所希望的效果,您正在“试图理解哪里出了问题”。我同意Johnsyweb。如果接下来要验证文件输入,该怎么办?很难找到用于上传错误、0字节文件等的正则表达式。这种体系结构对您的限制太多了。它现在可能可以工作,但如果您想更深入,该怎么办?请参阅我对Johnsyweb答案的评论,以了解为什么我不能(也不想)这样做把它分成两张支票。是的,现在我清楚地看到p
    ^[A-Za-z][A-Za-z0-9]*(?=.{3,31}$)[a-z0-9]{0,1}([a-z0-9._-][a-z0-9]+)*[a-z0-9.-_]{0,1}$