如何在PHP正则表达式中包含连字符和撇号


How to include hypens and apostrophes for a PHP Regex?

我正在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"当然是答案。