2010-09-27 106 views
1

我有這樣的文字:正則表達式的JavaScript問題

<body> 
<span class="Forum"><div align="center"></div></span><br /> 
<span class="Topic">Text</span><br /> 

    <hr /> 
    <b>Text</b> Text<br /> 
    <hr width=95% class="sep"/> 
    Text<a href="Text" target="_blank">Text</a> 
    <hr /> 
    <b>Text</b> -Text<br /> 
    <hr width=95% class="sep"/> 
**Text what i need.** 
    <hr /> 

和我正則表達式 「文本我需要什麼」 - /"sep"(.*)hr/m

這是錯誤的:爲什麼?

+0

您是否還需要帶錨標記的第一個Text部分? – 2010-09-27 10:43:41

+0

[朋友不要讓朋友用正則表達式解析HTML。](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – Ether 2010-09-27 16:32:05

回答

1

.與JavaScript正則表達式中的換行符不匹配。嘗試:

/"sep"([\s\S]*)hr/m 

國際海事組織,你是一個不同的方法更好,正則表達式不是理想的從HTML提取數據。更好的方法是創建一個div,將元素的屬性設置爲您所擁有的HTML字符串,然後使用DOM遍歷來查找所需的文本節點。

下面是我的意思的例子:http://www.jsfiddle.net/W33n6/。它使用下面的代碼來獲取文本:

var div = document.createElement("div"); 
div.innerHTML = html; 
var hrs = div.getElementsByTagName("hr"); 

for (var i = 0; i < hrs.length; i++) { 
    if (hrs[i].className == "sep") { 
     document.body.innerHTML = hrs[i].nextSibling.nodeValue; 
     break; 
    } 
}​ 

編輯:Gumbo's version比我更嚴格一點,檢查其他類之間的「SEP」級,並確保按照節點文本節點。

+0

感謝您的指示和鏈接! – guest 2010-09-27 11:00:05

2

不要使用正則表達式,使用DOM方法來代替:

var elems = document.getElementByTagName("hr"); 
for (var i=0; i<elems.length; ++i) { 
    var elem = elems[i]; 
    if (/(?:^|\s+)sep(?:\s|$)/.test(elem.className) && 
     elem.nextSibling && elem.nextSibling.nodeType === Node.TEXT_NODE) { 
     var text = elems.nextSibling.nodeValue; 
     break; 
    } 
} 

這將選擇所有HR元素,檢查其是否具有類並抓住下一個兄弟節點,如果它是一個文本節點。

+0

感謝您的指導! – guest 2010-09-27 10:59:18

+2

'Node.TEXT_NODE'不會在IE中定義,但它是一個常數,無論如何映射到數字3,所以你可以使用'nodeType === 3'。 – 2010-09-27 10:59:18