我需要一个正则表达式来匹配<p>
标签内的任何内容,例如,如果我有一些文字:
<p>Hello world</p>
正则表达式将匹配Hello world部分
答案 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)
编辑:不要这样做。只是不要。
如果你坚持,请使用<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*>