使用下划线validation用户名为字母数字

在我的注册页面上,我需要validation的用户名只有字母数字,但也可选的下划线。 我已经想出了这个:

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

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

\w的实际匹配字符取决于正在使用的语言环境 :

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

所以你应该更明确地指定你想要允许的字符:

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

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

如果只允许将下划线作为连接字符,并且要强制用户名必须以字母字符开始:

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

这是一个自定义函数,通过使用PHP ctype_alnum和允许的字符数组来validationstring:

 <?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; } } ?> 

尝试

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

对我看起来很好。 请注意,您不要求放置下划线,所以“username_”和“___username”都会通过。

我会采取秋波的二级正则expression式,只允许下划线串联,但在_之后加一个+,所以用户可以像“special__username”,只是一个小调整。

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

你自己的解决scheme是非常好的。

preg_match使用类Perl的正则expression式,其中字符类\w被定义为完全匹配你所需要的:

\w – 匹配“单词”字符(字母数字加“_”)

( 来源 )