【问题标题】:Extract text and links from HTML using Regular Expressions使用正则表达式从 HTML 中提取文本和链接
【发布时间】:2010-12-31 18:30:27
【问题描述】:

我想从包含链接的 html 文档中提取文本。例如:

来自此 HTML 代码

<div class="CssClass21">bla1 bla1 bla1 <a href="http://www.ibrii.com">go to ibrii</a> bla2 bla2 bla2 <img src="http://www.contoso.com/hello.jpg"> <span class="cssClass34">hello hello</span>

我只想提取这个

bla1 bla1 bla1 <a href="http://www.ibrii.com">go to ibrii</a> bla2 bla2 bla2 hello hello

在 StackOverflow 上的另一篇文章中,我发现了 RegEx &lt;[^&gt;]*&gt;,它允许通过将每个匹配项替换为空来提取文本。如何从匹配中排除锚标签? RegEx 似乎不允许反向匹配。

【问题讨论】:

  • 使用 HTML 解析器!正则表达式无法正确解析 HTML。
  • 你错过了这篇文章:stackoverflow.com/questions/1732348/…
  • 您使用什么编程语言?如果您告诉我们,答案可能对您更有意义。
  • 我在 Google Chrome 上使用 Javascript。我需要以某种方式过滤有效的 HTML 代码。
  • @Licx:您的 HTML 已经是 DOM 还是只是源代码?如果是前者,你真的应该使用 DOM 方法。

标签: html regex regex-negation


【解决方案1】:

暂时将&lt;a href ...&gt;...&lt;/a&gt;编码成别的东西,删除所有其他标签然后恢复&lt;a&gt;标签:

// Example in javascript:
string.
    replace(/<a(.*?)>/g,'\0$1\0').
    replace(/<\/a>/,'\1').
    replace(/<[^>]*>/,'').
    replace(/\0(.*?)\0/,'<a$1>').
    replace(/\1/,'</a>');

在上面的代码中,我使用 NUL 和 SOH 字符(ASCII 0x00 和 0x01)作为 &lt;a&gt; 标签的替换,因为它们不太可能出现在字符串中。随意将它们替换为不会出现在您的字符串中的任何其他字符或字符序列。

从其他 cmets 看来,您正在浏览器中进行操作。在这种情况下,浏览器已经将 HTML 解析为一个漂亮的 DOM 树。使用 DOM 方法解析树并按照您想要的方式处理它:

function simpleHTML (domNode) {
    var ret = "";
    if (domNode.nodeType === Node.ELEMENT_NODE) {
        var children = domNode.childNodes;
        for (var i=0;i<children.length;i++) {
            var child = children[i];

            // Filter out unwanted nodes to speed up processing.
            // For example, you can ignore 'SCRIPT' nodes etc.
            if (child.nodeName != 'SCRIPT') {
                if (child.nodeName == 'A') {
                    ret += '<a href="' + child.href + '">' +
                               simpleHTML(child) +
                           '</a>';
                }
                else {
                    ret += simpleHTML(child);
                }
            }
        }
    }
    else if (domNode.nodeType === Node.TEXT_NODE) {
        ret +=  domNode.nodeValue;
    }
    return ret;
}
// serialize the whole document:
var simpleDocument = simpleHTML(document.body);

// serialize a div:
var simpleDiv = simpleHTML(document.getElementById('some_div'));

// filter a html formatted string:
var temp = document.createElement('DIV');
temp.innerHTML = original_string;
simple_string = simpleHTML(temp);

【讨论】:

    【解决方案2】:

    正则表达式确实允许通过lookahead 进行非平凡的否定形式,但在这种情况下,它只是一个很好的练习,因为虽然我不是每次提到正则表达式时都会用圣火燃烧的狂热者HTML,这真是一个需要解析器来解决的问题。

    【讨论】:

      猜你喜欢
      • 2011-06-05
      • 2011-09-21
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2023-03-18
      • 2018-05-08
      相关资源
      最近更新 更多