【发布时间】:2011-06-20 12:21:01
【问题描述】:
我需要一个正则表达式来匹配<p> 标签中的任何内容,例如,如果我有一些文本:
<p>Hello world</p>
正则表达式将匹配 Hello world 部分
【问题讨论】:
-
哪种编程语言?也许你还有希望。
-
如果
<p>标签没有像通常(或至少经常)那样正确平衡怎么办?
标签: regex
我需要一个正则表达式来匹配<p> 标签中的任何内容,例如,如果我有一些文本:
<p>Hello world</p>
正则表达式将匹配 Hello world 部分
【问题讨论】:
<p> 标签没有像通常(或至少经常)那样正确平衡怎么办?
标签: regex
在javascript中:
var str = "<p>Hello world</p>";
str.search(/<\s*p[^>]*>([^<]*)<\s*\/\s*p\s*>/)
在 php 中:
$str = "<p>Hello world</p>";
preg_match_all("/<\s*p[^>]*>([^<]*)<\s*\/\s*p\s*>/", $str);
这些将匹配像这样复杂的东西
< p style= "font-weight: bold;" >Hello world < / p >
【讨论】:
<p>I would like <b>all</b> the text!</p>。
编辑:不要这样做。只是不要。
如果您坚持,请使用<p>(.+?)</p>,结果将在第一组。它并不完美,但不会有任何正则表达式解决 HTML 解析问题。
例如(在 python 中)
>>> import re
>>> r = re.compile('<p>(.+?)</p>')
>>> r.findall("<p>fo o</p><p>ba adr</p>")
['fo o', 'ba adr']
【讨论】:
<p >Spaces are valid in tags</p >
p 和> 之间有一个空格。
上述提议的解决方案似乎都将失败:
<a>、<em>等其他标签,就返回<p>...</p>标签内的文本。
或<p>和<path>或<p class="content"> 等属性的标签
考虑使用这个正则表达式:
<p(|\s+[^>]*)>(.*?)<\/p\s*>
生成的文本将被捕获到第 2 组中。
显然,只要关闭标签</p> 出于某种原因包含在注释标签<p> ... <!-- ... </p> ... --> 中,此解决方案就无法正常工作
【讨论】:
正则表达式:
<([a-z][a-z0-9]*)\b[^>]*>(.*?)</\1>
这适用于任何一对标签。
例如<p class="foo">hello<br/></p>
\1 确保开始标签与结束标签匹配。
标签之间的内容被捕获在\2中。
【讨论】:
您可以在 Python 中使用它作为综合解决方案:
import re
import bs4
import requests
page = requests.get(link)
page_content = bs4.BeautifulSoup(page.content,'html.parser')
result = page_content.find_all('p')
【讨论】:
对于任何查看此正则表达式或任何其他正则表达式以匹配特定 HTML 标记的人,下面的此正则表达式将根据需要工作:
<\s*p[^>]*>(.*?)<\s*\/\s*p\s*>
这将匹配 xzyfer 的回答中提到的以下字符串:
<p>I would like <b>all</b> the text!</p> < p style= "font-weight: bold;" >Hello world < / p >
在此处链接到 Regex101 上的正则表达式:https://regex101.com/r/kjpLII
如果您想将正则表达式用于其他 HTML 标记,而不仅仅是 p 标记,您可以将正则表达式中的 p 更改为您希望匹配的任何 HTML 标记:
<\s*div[^>]*>(.*?)<\s*\/\s*div\s*>
【讨论】:
<DIV>会有问题。