我试图了解这种正则表达式模式的错误:
'/^[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_
将匹配。
度过美好的一天,感谢所有人:)
答案 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
}
匹配
非匹配:
您可能想要匹配的不匹配:
答案 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)
答案 6 :(得分:0)
<input id="datepicker" class="datepicker" name="datepicker"/>
这将验证用户名
答案 7 :(得分:0)