我想要一个正则表达式来验证昵称:6到36个字符,它应至少包含一个字母。其他允许的字符:0-9和下划线。
这就是我现在所拥有的:
if(!preg_match('/^.*(?=\d{0,})(?=[a-zA-Z]{1,})(?=[a-zA-Z0-9_]{6,36}).*$/i', $value)){
echo 'bad';
}
else{
echo 'good';
}
这似乎有效,但是当验证这个字符串时,例如:
11111111111a>是无效的,但它应该 aaaaaaa!aaaa>是有效的,但它不应该
有什么想法让这个正则表达式变得更好?
答案 0 :(得分:4)
我实际上会将你的任务分成两个正则表达式:
/^\w{6,36}$/i
/[a-z]/i
我觉得这样简单得多。
答案 1 :(得分:2)
试试这个:
'/^(?=.*[a-z])\w{6,36}$/i'
以下是原始正则表达式的一些问题:
/^.*(?=\d{0,})(?=[a-zA-Z]{1,})(?=[a-zA-Z0-9_]{6,36}).*$/i
(?=\d{0,})
:这是为了什么?这总是正确的,什么都不做!(?=[a-zA-Z]{1,})
:您不需要{1,}
部分,只需要找到一个字母,i
标志也可以省略{ {1}} A-Z
:你在外观上匹配这些;它应该在里面/^.*
:这意味着只要有6-36 (?=[a-zA-Z0-9_]{6,36}).*$
个字符,其他字符串中的所有其他内容都匹配!该字符串可以是100个字符长,主要包含非法字符,它仍然匹配!答案 2 :(得分:0)
您可以使用两次调用preg_match轻松完成:
if( preg_match('/^[a-z0-9_]{6,36}$/i',$input) && preg_match('/[a-z]/i',$input)) {
// good
} else {
// bad
}