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

时间:2011-07-16 12:25:44

标签: php regex

我在PHP中编写了一个密码正则表达式,对于任何至少包含一个字符的字符串,它应返回false:

  • 小写字母 a-z
  • 大写字母 A-Z
  • 数字 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:

  • 连字符 -

3 个答案:

答案 0 :(得分:4)

你的正则表达式非常接近目标,但并不完全正确。

我会用这个:

$regex1 = '/^[a-z0-9 :,.!().?";\'-]+$/i';

兴趣点:

  • 将连字符移动到列表的末尾,这样就不会将其误认为字符范围分隔符
  • 根据PHP的字符串转义规则,用反斜杠转义它包含撇号
  • 删除A-Z部分,因为正则表达式包含不区分大小写的修饰符
  • 仅用空格替换*(在此上下文中表示“空格或星号”) - 如果您还想允许选项卡和换行符作为密码的一部分(不太可能),请将其替换为\s

答案 1 :(得分:2)

您只需使用'转义\即可。试试这个

$regex1 = '#^[a-zA-Z0-9" *":,.!-().?";\']+$#i';

你似乎已经在正则表达式中有-

答案 2 :(得分:1)

在字符类(正则表达式中用方括号表示)中,减号-始终引入范围:[A-Z]

你有!-(,这是没有意义的范围,因此没有按你的想法行事。解决方案:

  • -移至字符类的开头或结尾:[-A-Z...] / [A-Z...-]
  • 逃离-[A-Z\-...]

你问的另一个问题是“如何在PHP字符串中引用单引号?”并且与regex无关。但当然,“逃避它”就是答案。