一个坚实的昵称regexp

时间:2010-04-08 11:33:54

标签: php regex

我想要一个正则表达式来验证昵称: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>是有效的,但它不应该

有什么想法让这个正则表达式变得更好?

3 个答案:

答案 0 :(得分:4)

我实际上会将你的任务分成两个正则表达式:

  1. 以确定它是否是有效词:/^\w{6,36}$/i
  2. 以确定其是否包含字母/[a-z]/i
  3. 我觉得这样简单得多。

答案 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
}