如何使正则表达式模式中的点匹配换行符?
当文本之间存在空格和回车符时,我在执行正则表达式时遇到困难。
例如下面这个例子,我怎样才能得到正则表达式来得到“
”?<div id="content">
<div id="contentleft"> <SCRIPT language=JavaScript>
我尝试过
id="content">(.*?)<SCRIPT
,但没有成功。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
默认情况下,点匹配除换行符之外的所有内容。
/s
使其匹配所有内容。但实际上,使用 DOM 解析器。 您可以遍历树,也可以使用 XPath 查询。 可以将其视为 XML 的正则表达式。
XPath 非常强大。 这里有一些示例。
PS 我确信(我希望)上面的代码可以收紧一些。
Dot, by default, matches everything but newlines.
/s
makes it match everything.But really, use a DOM parser. You can walk the tree or you can use an XPath query. Think of it like regexes for XML.
XPath is extremely powerful. Here's some examples.
PS I'm sure (I hope) the above code can be tightened up some.
查看 PCRE 修饰符:https://www.pcre.pattern.modifiers.php" php.net/manual/en/reference.pcre.pattern.modifiers.php
您可以应用 s 修饰符,例如
'/id="content">(.*?)
否则,您可以执行
'/id= "content">((.|\n)*?)
编辑:哎呀,修饰符错误...
Take a look into the PCRE modifiers: https://www.php.net/manual/en/reference.pcre.pattern.modifiers.php
You can apply the s modifier, like
'/id="content">(.*?)<SCRIPT/s'
(Although, watch out, since it changes the way^
and$
work, too.Otherwise, you can do
'/id="content">((.|\n)*?)<SCRIPT/'
EDIT: oops, wrong modifier...
尝试
不要使用正则表达式解析 HTML 的常见警告适用,但您似乎已经知道了。
或者:
默认情况下,点不匹配换行符。 解决这个问题的一种方法是明确允许它们。 即使您碰巧使用的正则表达式风格不支持“dotall”修饰符,这也会起作用。
第一个正则表达式与您的方法相同,通过允许
\n
进行扩展。 您的比赛将属于第 1 组,您只需修剪它即可。第二个正则表达式使用零宽度断言(向前看/向后看)来标记匹配的开始和结束。 匹配不会包含任何您不想要的内容,无需分组。
Try
The usual warning not to parse HTML with regex applies, but you seem to know that already.
Alternatively:
The dot does not match newline characters by default. One way to get around that is to explicitly allow them. This would work even if the regex flavor you happen to use did not support a "dotall" modifier.
The first regex is equal to your approach, extended by allowing
\n
. Your match would be in group 1, you only need to trim it.The second regex uses zero-width assertions (look-ahead/look-behind) to mark the begin and the end of the match. The match would not contain anything you don't want, no grouping necessary.
另一种不使用正则表达式的解决方案:
Another solution without regular expressions:
嗯,这是一个多行问题,所以看看模式修饰符:
来自 http://www.php.net/manual/en /reference.pcre.pattern.modifiers.php
Well, it is a multi line issue so take a look at pattern modifiers:
from http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php
请更正我的 xpath 表达式 - 不确定它是否有效...
Please, correct my xpath expression - not sure if it will work...