我正在PHP中编写一个密码正则表达式,对于任何至少有一个字符而不是
的字符串,它应该返回false- 小写字母a-z
- 大写字母A-Z
- a数字0-9
- 空格" *"
- 标点符号:,.!().?";
到目前为止,我有这个:
<?php
$password = 'azAZ0 giggles 9*":,.!() .?";';
$regex1 = '#^[a-zA-Z0-9" *":,.!().?";'']+$#i';
if (preg_match($regex1, $password)) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
?>
这看起来像我想要的那样工作吗,或者你看到任何明显的错误吗?
我应该在正则表达式中添加什么,以便对于任何至少有一个字符而不是
的字符串,它应该返回false ?- 连字符-
您的正则表达式非常接近目标,但不完全正确。
我会用这个:
$regex1 = '/^[a-z0-9 :,.!().?";''-]+$/i';
兴趣点:
- 将连字符移动到列表的末尾,这样它就不会被误认为是字符范围分隔符
- 根据PHP的字符串转义规则,用反斜杠转义包含撇号
- 删除了
A-Z
部分,因为正则表达式包含不区分大小写的修饰符 - 将
*
(在此上下文中表示"空格或星号")替换为一个空格—如果您还想允许制表符和换行符作为密码的一部分(不太可能),请将其替换为's
您只需要使用'
转义'
。试试这个
$regex1 = '#^[a-zA-Z0-9" *":,.!-().?";'']+$#i';
和你似乎已经有-
在正则表达式。
在字符类中(用正则表达式中的方括号表示),- -
总是引入一个范围:[A-Z]
。
你有!-(
,这是没有意义的范围,因此不做你想的。解决方案:
- 将
-
移动到字符类的开始或结束位置:[-A-Z...]
/[A-Z...-]
转义
-
: [A-Z'-...]
你问的另一个问题是"我如何在PHP字符串中得到一个单引号?"和正则表达式没有任何关系。但是"escape it"当然是答案。