【问题标题】:Regex - Why doesn't this .* (dot-star) match line-breaks? [duplicate]正则表达式 - 为什么这个 .* (点星)不匹配换行符? [复制]
【发布时间】:2012-01-19 00:26:20
【问题描述】:

/(<pre>|<code>|\[code])(.*)(</pre>|</code>|\[/code])/gi

如果我有这样的东西,这很有效:

<code>foobar</code>

但如果我有这样的换行符:

<code>
    Awesome
</code>

它不会匹配它,我做错了什么?

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    您确实需要DOTALL modifer /s,因为默认情况下. 点不包括换行符。 /g 修饰符 OTOH 在 PHP 和 PCRE 中是不合法的。

    您还应该使用.*? 来避免匹配太宽。

    【讨论】:

      【解决方案2】:

      在 PCRE 中,“.”不匹配每个字符,它匹配所有不是换行符的东西:

      在字符类之外,模式中的点匹配主题中的任何一个字符, 包括非打印字符,但不包括(默认情况下)换行符。

      (http://www.php.net/manual/en/regexp.reference.dot.php)

      改用 [\s\S] 之类的东西。

      【讨论】:

      • 或者,你知道,你可以听我写我的时候弹出的其他三个有效答案中的任何一个。
      【解决方案3】:

      因为. 默认匹配每个字符除了换行符,除非您输入s 开关。

      查看正则表达式开关的说明here。

      特别是

      s (PCRE_DOTALL) 如果设置了这个修饰符,在 模式匹配所有字符,包括换行符。没有它, 换行符被排除在外。

      所以/(&lt;pre&gt;|&lt;code&gt;|\[code])(.*)(&lt;/pre&gt;|&lt;/code&gt;|\[/code])/is。

      (没有g,使用preg_match_all)。

      【讨论】:

        猜你喜欢
        • 2020-01-25
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多