我有一个字符串,包含普通字符,白色字符集和之间的换行符。此正则表达式不起作用:/<div>(.*)<\/div>
。这是因为.*
与换行符不匹配。我的问题是,怎么做?
答案 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)
?这匹配除换行符或以外的任何字符,因此匹配每个字符。至少为我解决了这个问题。