这是正确的正则表达式,允许A-Z a-z 0-9
和符号#&()-\;,.'"
和空格吗?
我正在努力应对正则表达式中的'
和"
。我做的正确吗?请注意\'
和\"
。这似乎不对。什么是正确的方法呢?
if (preg_match('/^[a-z0-9#&()-\;,.\'\" ]+$/i', $username) )
{
echo "Good";
}
else
{
echo "Bad";
}
答案 0 :(得分:2)
短划线应该被转义,双引号不需要。奇怪的是,你需要四倍来逃避分号前的反斜杠。否则,它被解释为您正在转义分号并被忽略。*
'/^[a-z0-9#&()\-\\\\;,.\'" ]+$/i'
你也可以在角色类的开头加一个未转义的破折号,虽然这有点模糊,可能会暂时混淆不知道该选项的人。它的工作原理是因为开头的短划线不能是有效字符范围的一部分,因此它只能是文字短划线字符。
'/^[-a-z0-9#&()\\\\;,.\'" ]+$/i'
*在正则表达式引擎看到之前,\\\\;
被PHP缩减为\\;
。然后,正则表达式引擎将\\;
缩减为\;
。因此,四个反斜杠!单个反斜杠\;
变为;
。同样适用于\\;
- PHP将其减少到\;
,然后正则表达式引擎将\;
解释为普通的分号;
。不少于四个。†
†实际上,我撒了谎。你可以逃脱三个反斜杠。但是你有点滥用PHP解析器的宽容。四是绝对是最好的。
答案 1 :(得分:-1)
括号也需要逃脱
'/^[a-z0-9#&\(\)\-;,.\'" ]+$/i'