2010-01-02 138 views
0

我想从html文档中提取文本,并在其中保留链接。例如:使用正则表达式从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不允许逆匹配。

+3

使用HTML解析器!正则表达式无法正确解析HTML。 – 2010-01-02 11:33:18

+0

您错过了这篇文章:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – 2010-01-02 11:34:39

+0

您使用什么编程语言?如果你告诉我们,答案可能与你更相关。 – 2010-01-02 11:34:54

回答

0

暂时编码<a href ...>...</a>成别的东西,删除所有其他标签则恢复<a>标签:

// 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),以替代<a>标签只是因为它们不太可能出现在字符串中。随意用任何其他不会出现在你的字符串中的字符或字符序列替换它们。

从其他评论看来,你正在浏览器中运行。在这种情况下,浏览器已经将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); 
+0

你摇滚人;) – Licx 2010-01-02 14:38:05

2

正则表达式确实允许否定的不平凡的形式通过lookahead但在这种情况下,它会像因为锻炼; Tibial刚刚好,虽然每次regexp与HTML一起被提及时,我都不会狂热地燃烧,但这真的是一个解析器需要解决的问题。