我在PHP
中使用以下正则表达式来测试密码有效性。
我允许使用数字,字母和特殊字符~!@#$%^&*()-_=+[]{}\|;:'",.<>/?
preg_match('/^[`~\!@#\$%\^&*\(\)\-_\=\+\[\]\{\}\\\|;\:\'",\.\<\>\/\?a-zA-Z\d]+$/', $password);
它似乎有效,因为它在true
为$password
时返回~!@#$%^&*()-_=+[]{}\|;:'",.<>/?
,但在我之间添加false
时返回whitespace
。
我的问题是,当密码包含♣
和类似字符时,它返回true。这真的是不受欢迎的。我该如何解决这个问题?
我对正则表达式知之甚少,所以如果有更好的方法,请告诉我。
答案 0 :(得分:1)
在正则表达式后添加u
标志以支持Unicode字符(该标志位于最终斜杠之后):
preg_match('/^[`~\!@#\$%\^&*\(\)\-_\=\+\[\]\{\}\\\|;\:\'",\.\<\>\/\?a-zA-Z\d]+$/u', $password);
有关详细信息,请参阅official PHP documentation。
答案 1 :(得分:1)
由于var_dump
的{{1}}的长度为7,因此♣
不是字符♣
。可以通过查看页面来源获得此信息。不要在标准浏览器页面中进行调试,因为不会在那里显示所有内容。
与您聊天并查看表单后,问题是您没有页面的字符集,因此浏览器将多字节字符转换为其十进制实体。添加
♣
应该解决问题。
你也过度逃避,在角色中有少量角色需要逃脱。这是一个简化的正则表达式:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
实体符合您的规则,因为^[`~!@#$%\^&*()\-_=+\[\]{}\\|;:\'",.<>\/?a-zA-Z\d]+$
s,&
s,#
和数字是允许的。
答案 2 :(得分:0)
如果我添加了元线,我尝试了它并使用特殊字符worked工作(匹配返回false(0))。没有元线,匹配返回true(1)。不确定你是否已经掌握了元线。
<head>
<meta charset="UTF-8">
...
</head>