如何使用正则expression式来匹配换行符

我有一个string包含正常字符,白色字符和之间的换行符。 这个正则expression式不起作用: /<div>(.*)<\/div> 。 这是因为.*与换行符不匹配。 我的问题是,如何做到这一点?

您需要使用DOTALL修饰符。

 '/<div>(.*)<\/div>/s' 

这可能不会给你什么你想要的,因为你是贪婪的匹配。 你可以尝试一个非贪婪的匹配:

 '/<div>(.*?)<\/div>/s' 

如果没有其他标签,您也可以通过匹配除“<”之外的所有内容来解决此问题:

 '/<div>([^<]*)<\/div>/' 

另一个观察是,你不需要使用/作为你的正则expression式分隔符。 使用另一个字符意味着您不必转义/ in </div> ,提高可读性。 这适用于所有上述正则expression式。 如果你使用'#'而不是'/',看起来如下:

 '#<div>([^<]*)</div>#' 

但是,所有这些解决scheme可能会由于嵌套的div,额外的空白,HTML注释和其他各种事情而失败。 HTML太复杂了,不能用正则expression式parsing,所以你应该考虑使用HTMLparsing器。

匹配所有的字符,你可以使用这个技巧:

 %\<div\>([\s\S]*)\</div\>% 

我知道这是一个古老的,但最近我偶然发现。 您也可以使用(?s) 模式修饰符 。 例如

 (?s)/<div>(.*?)<\/div> 

在正则expression式编译器中通常会有一个标志,告诉它该点应该匹配换行符。