2

我希望用户名长度为 4-32 个字符。

function validate_username($input)
{
    return (bool) preg_match('/^([a-z]+[a-z0-9_]*){4,32}$/i', $input);
}

请问我的尝试有什么问题吗?

var_dump(validate_username('h_q8Y'));返回FALSE

var_dump(validate_username('h_q8Yewre_'));回报TRUE

4

3 回答 3

5

{4,32}重复内括号匹配 4 次。您至少需要 4 个字母才能满足它。

要断言长度,您需要一个独立于字符类说明符的前瞻断言:

 preg_match('/^(?=.{4,32})([a-z]+[a-z0-9_]*)$/i'

                   |             |
             asserts length      |
                            checks char mix
于 2012-10-29T10:43:05.880 回答
3

你重复你的重复 4 到 32 次。我假设您想确保用户名以字母开头。在这种情况下,这可能是您正在寻找的:

preg_match('/^[a-z]\w{3,31}$/i', $input);

注意\w相当于[a-zA-Z0-9_]

于 2012-10-29T10:42:42.687 回答
2

你的正则表达式是错误的。这里

  • ([a-z]+[a-z0-9_]*)匹配h_q8Y
  • 然后{4,32}意味着将有至少 4 个最多 32h_q8Y. 但是你只提供了一个h_q8Y

因此它不起作用。

最好使用以下表达式。

/^[a-z]\w{3,31}$/i
于 2012-10-29T10:43:01.933 回答