我需要检查密码是否只包含英文数字和字母。我使用以下正则表达式:
if (!preg_match("^[A-Za-z0-9 _]*$^", $_POST['password']))
{
// show error
}
{
但这不起作用,并允许其他语言字符而不停止提交。有什么问题?
答案 0 :(得分:2)
删除^
末尾的preg_match
。 ^
表示(如果找到第一个字符)开头,如果它是结尾,则表示字符^
应该存在,但因为$
出现在它之前,意思是混乱,可能意味着一些事情,最“可能”的意思是结束角色^
。
使用regexpal.com测试您的正则表达式。
实际上我会改为:
if (preg_match("[^A-Za-z0-9 _]", $_POST['password']))
{
// invalid character
}
答案 1 :(得分:2)
没有“ENGLISH”号码或字母。使用与英语相同的字母表(或可以)编写许多语言。它通常被称为拉丁字母。
如果您真的只想接受拉丁字母数字字符,请使用:
if preg_match("/^[a-zA-Z0-9]+$/", $_POST['password']) {
//good to go
} else {
//I don't like this password
}
您的原始正则表达式有一个额外的尾随^
,它允许空格和下划线。你想要允许这些角色吗?如果是,请使用^[\w ]+$
。
但是,如果您这样做是为了限制密码可以包含的字符,您是否停下来思考您正在做什么?限制您接受密码的字符集会大大降低其强度。您应该允许最宽范围的字符允许用户选择强密码。
如果您要检查弱密码,请忽略。但是,您应该考虑其他因素,如长度和字典单词的存在。有关详细信息,请参阅this answer。
在相关说明中,您是否以散列形式存储用户的密码?这是绝对必要的。
答案 2 :(得分:0)
尝试
preg_match('/^[\w]+$/', $_POST['password'] ) instead !
替代方案:
preg_match("/^[a-zA-Z0-9]+$/", $_POST['password'])
答案 3 :(得分:0)
preg_match()
等使用第一个字符中的分隔符设置。这将结束正则表达式,之后字符串必须结束或仅指定修饰符。
因此,您的代码应该是例如。
if (!preg_match('`^[A-Za-z0-9 _]+$`', $_POST['password']))
{
// show error
}
{
你使用^
作为分隔符,但是应该使用它来使你的正则表达式从字符串start开始匹配,因此我使用反引号`因为它很少在字符串中使用(其他人会使用{{1} })。
此外,使用单引号,因为双引号/
允许美元变量引用,但您希望"
表示要匹配的密码的结尾。
还有一件事:匹配$
也会允许你不应该鼓励的空密码,因此[...]*
(尽管如果你宁愿拥有至少 n的密码,这是值得商榷的字符,即使用+
进行匹配。