正则表达式需要匹配p标签内的任何内容

时间:2011-02-03 08:44:13

标签: regex

我需要一个正则表达式来匹配<p>标签内的任何内容,例如,如果我有一些文字:

<p>Hello world</p>

正则表达式将匹配Hello world部分

6 个答案:

答案 0 :(得分:8)

在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 >

答案 1 :(得分:5)

编辑:不要这样做。只是不要。

请参阅this question

如果你坚持,请使用<p>(.+?)</p>,结果将在第一组中。它并不完美,但无法解决HTML解析问题的正则表达式。

E.g(在python中)

>>> import re
>>> r = re.compile('<p>(.+?)</p>')
>>> r.findall("<p>fo o</p><p>ba adr</p>")
['fo o', 'ba adr']

答案 2 :(得分:1)

正则表达式:

<([a-z][a-z0-9]*)\b[^>]*>(.*?)</\1>

这适用于任何一对标签。

例如<p class="foo">hello<br/></p>

\ 1确保开始标记与结束标记匹配。

标签之间的内容在\ 2。

中捕获

答案 3 :(得分:0)

上述提议的解决方案似乎都将失败:

  • 在包含其他标记(例如<p>...</p><a>等)的情况下返回<em>标记内的文本。 或
  • 区分<p><path>
  • 包括属性为<p class="content">的标签

考虑使用此正则表达式:

<p(|\s+[^>]*)>(.*?)<\/p\s*>

结果文本将在第2组中捕获。


很明显,无论何时出于某种原因将关闭标签</p>括在注释标签<p> ... <!-- ... </p> ... -->中,此解决方案将无法正常工作

答案 4 :(得分:0)

您可以在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')

答案 5 :(得分:0)

对于寻找此Regex或任何其他正则表达式以匹配特定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上链接到Regex:https://regex101.com/r/kjpLII


如果您想将正则表达式用于其他HTML标签而不是仅用于p标签,则可以将正则表达式中的p更改为您希望匹配的HTML标签:

<\s*div[^>]*>(.*?)<\s*\/\s*div\s*>