【问题标题】:regex needed to match anything within p tags正则表达式需要匹配 p 标签中的任何内容
【发布时间】:2011-06-20 12:21:01
【问题描述】:

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

<p>Hello world</p>

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

【问题讨论】:

标签: regex


【解决方案1】:

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

【讨论】:

  • 如果里面有标签则失败,如&lt;p&gt;I would like &lt;b&gt;all&lt;/b&gt; the text!&lt;/p&gt;
【解决方案2】:

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

this question

如果您坚持,请使用&lt;p&gt;(.+?)&lt;/p&gt;,结果将在第一组。它并不完美,但不会有任何正则表达式解决 HTML 解析问题。

例如(在 python 中)

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

【讨论】:

  • 这也匹配 p 标签,虽然我不希望返回标签
  • 无法匹配&lt;p &gt;Spaces are valid in tags&lt;/p &gt;
  • MSalters 谈论的是标签 in 中的空格,而不是它们之间的空格。即:p&gt; 之间有一个空格。
  • 哦,没关系。您真的应该从不尝试使用正则表达式解析 ANY html 的另一个原因。 "#¤()%#=!"¤(=!"#¤!哼,我现在应该知道了
【解决方案3】:

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

  • 只要包含&lt;a&gt;&lt;em&gt;等其他标签,就返回&lt;p&gt;...&lt;/p&gt;标签内的文本。 或
  • 区分&lt;p&gt;&lt;path&gt;
  • 包含带有&lt;p class="content"&gt; 等属性的标签

考虑使用这个正则表达式:

&lt;p(|\s+[^&gt;]*)&gt;(.*?)&lt;\/p\s*&gt;

生成的文本将被捕获到第 2 组中。


显然,只要关闭标签&lt;/p&gt; 出于某种原因包含在注释标签&lt;p&gt; ... &lt;!-- ... &lt;/p&gt; ... --&gt; 中,此解决方案就无法正常工作

【讨论】:

  • 这确实是对OP最完整的答案。应该是公认的答案!
【解决方案4】:

正则表达式:

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

这适用于任何一对标签。

例如&lt;p class="foo"&gt;hello&lt;br/&gt;&lt;/p&gt;

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

标签之间的内容被捕获在\2中。

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      对于任何查看此正则表达式或任何其他正则表达式以匹配特定 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*>
      

      【讨论】:

      • 嵌套&lt;DIV&gt;会有问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多