2012-04-02 85 views
3

我想用preg_match()来验证PHP中的用户名,但我似乎无法按照我想要的方式工作。我需要preg_match()到:如何使用`preg_match()`来匹配用户名

  1. 接受在字符串
  2. 接受句点,破折号,下划线字母的开头和结尾只有字母或数字,数字
  3. 必须有5-20个字符
  4. 之间的长度

preg_match('/^[a-zA-Z0-9]+[.-_]*[a-zA-Z0-9]{5,20}$/', $username) 

回答

6

分解要求成小块,你会发现它变得容易多了:

  • 第一个字符必须是1个字母或数字
  • 的中间人物必须是句点,短划线下划线,字母或数字
  • 最后一个字符必须是字母或数字
  • 作为第一个和最后部分必须是1个字符,中间必须是3至18
~^[a-z0-9]{1}[a-z0-9._-]{3,18}[a-z0-9]{1}$~i 
+3

由于括号意味着与集合中的任何_one_字符匹配,因此不需要使用“{1}”。另外,您需要在第二组括号内跳过点,否则显然会与任何字符匹配。 – Madbreaks 2012-04-02 01:00:12

+1

@Madbreaks其实,我认为在这种情况下,这段时间不必逃避。尽管如此,这样做绝对没有坏处。至于{1},你说得对,那些是多余的,但我喜欢把它们放在部分习惯之外,部分原因是我喜欢我的常规表达尽可能清楚。 – Corbin 2012-04-02 01:07:05

+1

感谢Corbin,你对这个点是正确的 - 谢谢你指出我的错误! – Madbreaks 2012-04-02 01:11:09

2

如果正则表达式是混淆了你,你总是可以将字符与正则表达式匹配,然后用strlen()明确检查字符串的长度。

$valid = preg_match('/^[a-zA-Z\d]+[\w.-]*[a-zA-Z\d]$/', $username) 
     AND strlen($username) >= 5 AND strlen($username) <= 20; 
2
if (preg_match('~^[0-9a-z][-_.0-9a-z]{3,18}[0-9a-z]$~i', $username) > 0) 
{ 
    // valid 
} 
+0

@alex:你错了。 =) – 2012-04-02 00:39:48

+0

您需要在第二组括号中转义该点,否则它将与任何字符匹配。 – Madbreaks 2012-04-02 01:01:02

+2

@Madbreaks:不,它不会。你也错了。 =) – 2012-04-02 01:08:20