【问题标题】:PHP Regex Any CharacterPHP 正则表达式 任何字符
【发布时间】:2010-10-26 17:26:11
【问题描述】:

php 正则表达式中的. 字符接受除换行符以外的所有字符。我可以使用什么来接受所有字符,包括换行符?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    这通常用于捕获所有字符:

    [\s\S]
    

    您可以以同样的方式使用“Type-X + Non-Type-X”的任何其他组合:

    [\d\D]
    [\w\W]
    

    [\s\S] 按照惯例被认为是“真的任何东西”的简写。

    如果您通过"s" 修饰符将正则表达式切换到“dotall”(也称为“单行”)模式,您也可以使用.。有时这不是一个可行的解决方案(例如,黑盒中的动态正则表达式,或者如果您不想修改 整个 正则表达式)。在这种情况下,无论正则表达式如何配置,其他替代方案都会这样做。

    【讨论】:

    • 你为什么会这样想?
    • regex101.com 上进行测试。它说正则表达式是任何单个空格或非空格。看起来 (.*?) 将允许字符的任意组合(但仍然不是换行符)。
    • 当然,您必须添加您选择的乘数。毕竟,“任何角色”都是问题。
    【解决方案2】:

    . 字符表示“每个字符”(edit:OP 已编辑)。您需要将选项 s 添加到您的正则表达式中,例如:

    preg_match("`(.+)`s", "\n");
    

    【讨论】:

    • 正则表达式的开头和结尾不应该有正斜杠吗?
    • 可以,但任何一对分隔符都可以。
    • PHP 中没有。它必须以分隔符开头和结尾(您可以选择它),并且最后一个分隔符之后的每个字符都是一个选项(即 U 表示不贪婪,i 表示不区分大小写等)
    • +1 根据您的需要,m 也是一个选项。但基于 OP,s 是要走的路。
    • 有人应该解释一下s(也许还有m)才能真正完成。
    【解决方案3】:

    [.\n]+
    

    不工作?

    (.|\n)+ 怎么样?我测试了它,它似乎可以工作。

    我很确定这正是您所要求的字面解释。

    【讨论】:

    • 字符类中的. 并不意味着“任何字符”。它的意思是“一个点”。字符类有自己的语法。 ;-)
    • @Tomalak:谢谢你的解释,我现在才意识到。我想我应该在发布之前测试我的答案。我现在已经编辑了我的答案。
    • 常见错误。我看到人们经常使用[this|that|\d],而他们真正的意思是(this|that|\d)P.S.:(.|\n) 有效,但它的效率可能比字符类略低。
    • 很高兴我只有一些元字符混乱。不要以为我会尝试放一个“|”在“[]”中,我只想尽可能避免使用“()”,因为它们还用于在 Perl(和其他语言)中的某些内容匹配时初始化特殊变量。
    • 我认为这种方法的一个问题是你“硬连线”了字符集。如果有一天,有人发明了一个与. 不匹配的字符(已经是:\t),则需要重写所有基于这种假设的库......跨度>
    【解决方案4】:

    PHP 手册page for Dot 指出:

    如果设置了 PCRE_DOTALL 选项,则点也匹配换行符。

    【讨论】:

      【解决方案5】:

      这里缺少一个重要的东西。 [\s\S] 匹配一个字符,而换行符可以是一个字符序列。 (Windows 使用两个字符:\r\n。).(带有DOT_ALL 修饰符)和[\s\S] 都不会匹配换行符序列。匹配任何字符或任何换行符的最佳方法是(.|\R),“除换行符或换行符之外的所有内容”。 \R 匹配 \n\r\r\n

      【讨论】:

        猜你喜欢
        • 2011-02-04
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-22
        • 2014-10-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多