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

8

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

如果文本中出现以下内容:

<code>foobar</code>

但如果文本中存在换行符,如下所示:

<code>
    Awesome
</code>

它不会匹配它,我做错了什么?
3个回答

16
你需要使用DOTALL修饰符/s,因为默认情况下.不包括换行符。 然而,在PHP和PCRE中,/g修饰符是非法的。
你应该使用.*?来避免匹配太宽泛。

6
在PCRE中,"."不匹配每个字符,它匹配除换行符之外的所有内容:
在模式中,字符类外的点匹配主题中的任何一个字符,包括非打印字符,但默认情况下不包括换行符。

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

尝试使用 [\s\S] 等代替。

3
或者,你也可以听取我写作期间弹出的其他三个有效答案中的任何一个。 - Kara Brightwell

3
因为默认情况下 . 匹配每个字符,但除了换行符之外,除非您使用了s开关。
有关正则表达式开关的解释,请单击此处
特别地,

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

所以 /(<pre>|<code>|\[code])(.*)(</pre>|</code>|\[/code])/is
(不需要g,请使用preg_match_all)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接