2010-01-02 37 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一起被提及時,我都不會狂熱地燃燒,但這真的是一個解析器需要解決的問題。

相關問題