如何使用正则表达式使点匹配换行符

时间:2009-12-31 16:02:14

标签: php regex

我有一个字符串,包含普通字符,白色字符集和之间的换行符。此正则表达式不起作用:/<div>(.*)<\/div>。这是因为.*与换行符不匹配。我的问题是,怎么做?

6 个答案:

答案 0 :(得分:39)

您需要使用DOTALL修饰符。

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

这可能不会给你你想要的东西,因为你是贪婪的匹配。您可能会尝试非贪婪的匹配:

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

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

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

另一个观察结果是,您不需要使用/作为正则表达式分隔符。使用其他字符意味着您不必转义/中的</div>,从而提高可读性。这适用于所有上述正则表达式。如果您使用'#'代替'/',那么就会显示:

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

但是,由于嵌套的div,额外的空格,HTML注释和各种其他内容,所有这些解决方案都可能失败。 HTML太复杂,无法使用Regex进行解析,因此您应该考虑使用HTML解析器。

答案 1 :(得分:12)

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

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

答案 2 :(得分:8)

我知道这是一个旧的,但我最近偶然发现了它。您还可以使用(?s) mode modifier。 E.g。

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

答案 3 :(得分:1)

选项是:

'/<div>(\n*|.*)<\/div>/i'

哪个匹配 换行符或点标识符匹配。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

也许我没有找到明显的东西,但是仅仅这样做有什么问题

(.|\n)

?这匹配除换行符以外的任何字符,因此匹配每个字符。至少为我解决了这个问题。