正则表达式 - 为什么不。*(点星)匹配换行符?

时间:2012-01-19 00:26:20

标签: php regex preg-match

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

如果我有以下内容,则可以使用:

<code>foobar</code>

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

<code>
    Awesome
</code>

它不符合它,我做错了什么?

3 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:6)

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

  

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

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

尝试使用类似[\ s \ S]的内容。

答案 2 :(得分:3)

默认情况下,.匹配除换行符之外的每个字符,除非您输入s开关。

请参阅正则表达式开关的解释here

特别是

  

s(PCRE_DOTALL)如果设置了此修饰符,则中的点元字符   模式匹配所有字符,包括换行符。没有它,   新线被排除在外。

所以/(<pre>|<code>|\[code])(.*)(</pre>|</code>|\[/code])/is

(否g,请使用preg_match_all)。