将用户名验证为带下划线的字母数字

时间:2009-08-25 20:14:14

标签: php regex preg-match

在我的注册页面上,我需要仅将用户名验证为字母数字,还要使用可选的下划线。我想出了这个:

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^\w+$/',$str);
}

这似乎工作正常,但我不是正则表达式专家!有没有人发现任何问题?

6 个答案:

答案 0 :(得分:69)

正在使用的实际matched characters of \w depend on the locale

  

“单词”字符是任何字母或数字或下划线字符,即任何可以成为Perl“ 单词 ”一部分的字符。字母和数字的定义由PCRE的字符表控制,如果发生特定于语言环境的匹配,则可能会有所不同。例如,在“fr”(法语)语言环境中,一些大于128的字符代码用于重音字母,并且这些字符代码由\ w匹配。

因此,您应该更明确地指定要允许的字符:

/^[A-Za-z0-9_]+$/

这只允许使用字母数字字符和下划线。

如果你想只允许下划线作为连接字符,并想强制用户名必须以字母字符开头:

/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/

答案 1 :(得分:16)

这是一个自定义函数,通过将PHP ctype_alnum与允许的字符数组结合使用来验证字符串:

<?php

$str = "";
function validate_username($str) {

  // each array entry is an special char allowed
  // besides the ones from ctype_alnum
  $allowed = array(".", "-", "_");

  if ( ctype_alnum( str_replace($allowed, '', $str ) ) ) {
    return $str;
  } else {
    $str = "Invalid Username";
    return $str;
  }
}

?>

答案 2 :(得分:10)

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}

答案 3 :(得分:3)

对我来说很好看。请注意,您不需要放置下划线,因此“username_”和“___username”都会通过。

答案 4 :(得分:1)

我会使用gumbo的二级正则表达式,只允许下划线作为连接,但在_之后添加一个+,这样用户可以像“special__username”,只是一个小调整。

/^[A-Za-z][A-Za-z0-9]*(?:_+[A-Za-z0-9]+)*$/

答案 5 :(得分:0)

你自己的解决方案非常好。

preg_match使用类似Perl的正则表达式,其中定义的字符类\w完全匹配您所需的:

  

\w - 匹配“字”字符(字母数字加“_”)

source