为什么此正则表达式匹配不需要的特殊字符?

时间:2017-01-22 15:04:16

标签: php regex

我在PHP中使用以下正则表达式来测试密码有效性。

我允许使用数字,字母和特殊字符~!@#$%^&*()-_=+[]{}\|;:'",.<>/?

preg_match('/^[`~\!@#\$%\^&*\(\)\-_\=\+\[\]\{\}\\\|;\:\'",\.\<\>\/\?a-zA-Z\d]+$/', $password);

它似乎有效,因为它在true$password时返回~!@#$%^&*()-_=+[]{}\|;:'",.<>/?,但在我之间添加false时返回whitespace

我的问题是,当密码包含和类似字符时,它返回true。这真的是不受欢迎的。我该如何解决这个问题?

我对正则表达式知之甚少,所以如果有更好的方法,请告诉我。

3 个答案:

答案 0 :(得分:1)

在正则表达式后添加u标志以支持Unicode字符(该标志位于最终斜杠之后)

preg_match('/^[`~\!@#\$%\^&*\(\)\-_\=\+\[\]\{\}\\\|;\:\'",\.\<\>\/\?a-zA-Z\d]+$/u', $password);

有关详细信息,请参阅official PHP documentation

答案 1 :(得分:1)

由于var_dump的{​​{1}}的长度为7,因此不是字符&#9827;。可以通过查看页面来源获得此信息。不要在标准浏览器页面中进行调试,因为不会在那里显示所有内容。

与您聊天并查看表单后,问题是您没有页面的字符集,因此浏览器将多字节字符转换为其十进制实体。添加

应该解决问题。

你也过度逃避,在角色中有少量角色需要逃脱。这是一个简化的正则表达式:

<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>