正则表达式验证用户名

时间:2011-04-10 01:54:49

标签: php regex

我试图了解这种正则表达式模式的错误:

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

我要做的是验证用户名。允许的字符是字母数字,短划线,下划线和点。我试图实现的限制是至少有一个字母数字字符,因此不允许用户使用这样的昵称:_-_.

我现在使用的功能是:

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

在这种情况下,_-this-is-me-_将不匹配,但_this-is-me_将匹配。

度过美好的一天,感谢所有人:)

8 个答案:

答案 0 :(得分:6)

不要试图把它全部塞进一个正则表达式。让您的生活更简单,并采用两步法:

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)

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

答案 1 :(得分:2)

试试这个:

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

答案 2 :(得分:1)

这可能只是一个问题,如果微调,你可以尝试这样的事情:

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

匹配

  • a_b< - 你可能不想要这个。
  • ysername
  • 用户名
  • 1254_2367
  • fg3123as

非匹配:

  • l__asfg
  • AHA_ar3f!
  • sAD_ASF _#“#Ť_
  • “#%” &安培;#“E
  • __-。ASD
  • 用户名
  • 1_ _ _

您可能想要匹配的不匹配:

  • 1_5_2
  • this_is_my_name

答案 3 :(得分:1)

我很清楚你应该把它分成两个支票!

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

然后检查它们是否至少有一个字母数字字符。如果他们不是,那么你可以告诉他们必须这样做。

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

答案 4 :(得分:1)

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

$re = '/ # Match password having at least one alphanum.
    ^                   # Anchor to start of string.
    (?=.*?[A-Za-z0-9])  # At least one alphanum.
    [\w\-.]{4,20}       # Match from 4 to 20 valid chars.
    \z                  # Anchor to end of string.
    /x';

行动(简称):

function validate($string){
    $re = '/^(?=.*?[A-Za-z0-9])[\w\-.]{4,20}\z/';
    return (bool) preg_match($re, $string);
}

答案 5 :(得分:0)

试试这个:

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

来自相关问题:Create one RegEx to validate a username

答案 6 :(得分:0)

<input id="datepicker" class="datepicker" name="datepicker"/>

这将验证用户名

  1. 以alpha
  2. 开头
  3. 接受下划线破折号和点
  4. 不允许空格

答案 7 :(得分:0)

你为什么不把它简化成这样?

^[a-zA-Z][a-zA-Z0-9\._-]{3,9}

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

enter image description here