【问题标题】:how to extract body contents using regexp [duplicate]如何使用正则表达式提取正文内容
【发布时间】:2011-04-07 09:38:35
【问题描述】:

我在 var 中有这段代码。

<html>

    <head>
        .
        .
        anything
        .
        .
    </head>

    <body anything="">
        content
    </body>

</html>

<html>

    <head>
        .
        .
        anything
        .
        .
    </head>

    <body>
        content
    </body>

</html>

结果应该是

content

【问题讨论】:

  • @marcgg 的意思是你不能用正则表达式解析 HTML。
  • 出于某种原因,这个问题每小时都会被问一次。因此他感到沮丧。
  • 问题不在于解析 HTML - 它是关于提取 BODY 的内容
  • @michael,不同的任务,啊哈。
  • 所以我来到这里是因为我也已经到了想要使用正则表达式的地步。到目前为止,我使用 DOMParser 做得很好。原因:Chrome 非常担心我可能会丢失命名空间,所以它会在我使用 innerHTML 提取正文的那一刻为所有内容添加一个 xmlns 属性。我不想要那个。否则我找不到任何方法来说服它:-(

标签: javascript html regex


【解决方案1】:

请注意,上面提供的基于字符串的答案在大多数情况下都应该有效。正则表达式提供的一个主要优势 解决方案是您可以更轻松地在打开/关闭正文标签上提供不区分大小写的匹配。如果这不是您关心的问题,那么这里没有使用正则表达式的主要原因。

对于那些同时看到 HTML 和正则表达式并大吃一惊的人来说……由于您实际上并没有尝试用它来解析 HTML,因此您可以使用正则表达式来做一些事情。如果由于某种原因,content 包含 &lt;/body&gt;,那么它会失败,但除此之外,您还有一个足够具体的场景,正则表达式能够执行您想要的操作:

const strVal = yourStringValue; //obviously, this line can be omitted - just assign your string to the name strVal or put your string var in the pattern.exec call below 
const pattern = /<body[^>]*>((.|[\n\r])*)<\/body>/im;
const array_matches = pattern.exec(strVal);

执行上述操作后,array_matches[1] 将保存 &lt;body&lt;/body&gt; 标签之间的任何内容。

【讨论】:

  • 这解释了为什么正则表达式是解析 Html stackoverflow.com/questions/590747/… 的错误选择
  • @Doug 尝试从高层次解析 HTML 与尝试提取单个标签的特定内容之间存在巨大差异。尤其是问题和答案都指示的标记在所有源材料中只出现一次。
  • 例如,如果您在“p”标签上运行它会中断。它将返回包含在第一个

    和找到的最后一个

    之间的所有内容
  • @kilianc 是的,正如它所写的那样,它专门用于&lt;body&gt; 标记(尽管它也可以用于在正确编写的 HTML 文档中恰好出现一次的任何标记,例如 &lt;head&gt; )。要将其用于重复标签,您需要进行一些修改。但这不是这里的问题。
  • @Jeffrey Blake 你能分享一下要修改什么吗?
【解决方案2】:
var matched = XMLHttpRequest.responseText.match(/<body[^>]*>([\w|\W]*)<\/body>/im);
alert(matched[1]); 

【讨论】:

    【解决方案3】:

    我相信您可以将 html 文档加载到 .net HTMLDocument 对象中,然后简单地调用 HTMLDocument.body.innerHTML?

    我相信更新的 XDocumnet 也有更简单的方法。

    并且仅仅为了呼应上面的一些 cmets 正则表达式并不是最好的工具,因为 html 不是一种常规语言,并且有一些难以解决的边缘情况。

    https://en.wikipedia.org/wiki/Regular_language

    享受吧!

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 2010-09-26
      • 2017-06-26
      • 1970-01-01
      • 2011-02-18
      • 2014-01-12
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      相关资源
      最近更新 更多