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

27 php regex

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

Mar*_*ers 39

您需要使用DOTALL修改器.

'/<div>(.*)<\/div>/s'
Run Code Online (Sandbox Code Playgroud)

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

'/<div>(.*?)<\/div>/s'
Run Code Online (Sandbox Code Playgroud)

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

'/<div>([^<]*)<\/div>/'
Run Code Online (Sandbox Code Playgroud)

另一个观察是您不需要使用/正则表达式分隔符.使用其它字符意味着你没有逃脱/</div>,提高了可读性.这适用于所有上述正则表达式.如果您使用'#'而不是'/',它会显示:

'#<div>([^<]*)</div>#'
Run Code Online (Sandbox Code Playgroud)

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


小智 12

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

%\<div\>([\s\S]*)\</div\>%
Run Code Online (Sandbox Code Playgroud)

  • 这是一个解决JavaScript缺乏DOTALL /单线模式的黑客攻击; 在PHP中不需要它.另外,`<`和`>`没有特殊含义,所以你不必逃避它们. (5认同)

aca*_*lon 10

我知道这是一个旧的,但我最近偶然发现了它.您也可以使用(?s) 模式修改器.例如

(?s)/<div>(.*?)<\/div>
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案! (2认同)

Dav*_*nal 5

只要这样做就不会有任何问题:

(.|\n)
Run Code Online (Sandbox Code Playgroud)

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