题
在我的注册页面我需要验证的用户名作为字母数字只,而且还与可选的下划线。我想出了这一点:
function validate_alphanumeric_underscore($str)
{
return preg_match('/^\w+$/',$str);
}
这似乎工作不错,但我不是一个正则表达式的专家!有谁发现任何问题?
解决方案
在实际匹配\w
的字符取决于区域设置正在使用:
一个“字”的字符是任何字母或数字或下划线字符,也就是,它可以是一个Perl“的 字 强>”的一部分的任何字符。字母和数字的定义由PCRE字符表控制,如果特定区域设置匹配正在发生可能会有所不同。例如,在“FR”(法国)区域,一些字符码大于128瓦特用于重音字母,并且这些匹配由\。
所以,你应该更好地明确指定你想要的字符,可以让:
/^[A-Za-z0-9_]+$/
这仅允许字母数字字符和下划线
如果你想允许下划线仅作为连接字符,并要强制该用户名必须以字母字符开头的:
/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/
其他提示
这里的一个自定义函数通过使用 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;
}
}
?>
试
function validate_alphanumeric_underscore($str)
{
return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}
看起来没什么问题。请注意,您为下划线的位置没有要求,所以“username_”和“___username”既会传球。
我会采取秋葵的次要正则表达式,以仅允许下划线作为串联,但经过_这样用户就可以像“special__username”,只是一个小的调整。
添加+ /^[A-Za-z][A-Za-z0-9]*(?:_+[A-Za-z0-9]+)*$/
不隶属于 StackOverflow