2013-07-02 38 views
0

這是一個小問題,如果我們正在做jQuery,只是標記TR並將其刪除等等。但我很好奇如何以一種嚴格的正則表達式來做到這一點..哪操縱dom。正則表達式。刪除<tr>,它的所有內容直到結束tr標記

我有這樣的:

<tr id="anyName"> 
    <td> 
     // a bunch of html 
    </td> 
</tr> 

你會如何使用正則expressesions來替換TR,一切都在爲「」。

我有這樣的:

sometable.replace(」「 「*?」);

我嘗試了一些其他的東西,但我無法得到這個工作。基本上,我想要這個tr及其所有內容。我正在使用服務器端模板引擎,在進入視圖之前處理所有這些數據。所以,我可以將這些數據作爲一個字符串保存到這個模板邏輯中......然後將其刪除......但由於它是一個字符串,我需要使用正則表達式來刪除它。

任何想法?我覺得我錯過了一些非常簡單的東西。

+5

您可以使用正則表達式的HTML,如果結構受到嚴格控制(沒有遞歸標籤等)。你的問題沒有說明結構有多嚴格。有關一般情況,請參閱http://stackoverflow.com/a/1732454/39068。 –

+3

「我有一顆螺絲擰進去,但我很好奇誰會用錘子代替螺絲刀來做這個。」除非您可以保證HTML遵循一個非常嚴格的模式,否則您會要求將HTML解析器編寫爲正則表達式模式。儘管可以創建基於正則表達式的解析器,但使用正則表達式解析HTML並不是真的可行。無論哪種方式,編寫解析器都遠遠超出了答案的範圍。 – ikegami

+0

首先省略不需要的標記應該更簡單,或者給它一個將其設置爲* display:none *的類。 – RobG

回答

4

問題是,<tr>可以嵌套<tr>標籤內..

而且在某些情況下,<tr>標籤結束標記(除XHTML)

所以,正則表達式贏得「T能夠去除這樣的標籤,即使您使用奇正則表達式中的編號模式

所以,請不要使用正則表達式這個


由於您使用jQuery你可以使用remove

$('tr').remove(); 

,或者你可以使用一些其他的服務器端HTML parser..But不使用regex..It可以打破你的網站


要回答你的問題,你可以使用這個表達式

(?s)<tr[^<>]*>(.(?!<tr[^<>]*>))*?</tr> 

或在javascript

/<tr[^<>]*>(.(?!<tr[^<>]*>))*?<\/tr>/s 

demo

但wait.you需要,直到它替換所有內容

所以,你需要使用for循環和循環,直到不斷更換它取代所有..

但是,這個正則表達式可能會打破incase沒有結束標記

+1

+1不建議使用正則表達式,但是......結束標記是可選的時,正則表達式可以匹配所有內容,但不包括下一個打開的TR。儘管嵌套表格不夠用。 :-(使用解析器。 – RobG

+0

@RobG哦......是的..想法.. – Anirudha

0

@Airirh是正確的;這可能是一個非常困難的問題,這要歸功於嵌套的<tr>標籤和未封閉的<tr>標籤。但假設您沒有嵌套或未封閉的標籤,您確實可以使用正則表達式來解決此問題。

// if your html is in a variable called "html", you can get rid of <tr> tags thusly: 
html = html.replace(/<tr[^]*?<\/tr>/, ''); 

請注意,我們不能在打開和關閉<tr>標籤之間使用.*。爲什麼?由於.通配符與換行符不匹配,因此[^]的「匹配任何內容」組。還要注意,我們不會嘗試匹配開頭<tr>標籤中的閉角尖括號,因爲標籤中可能存在屬性。

如果您的HTML格式良好,不能是您的<tr>標記之間的任何內容(除註釋外)。然而,如果你想保留這些評論(並且總體考慮這個習慣是一件好事),你必須小心:如果你使用默認的貪婪*量詞,它會吞噬一切首先打開<tr>標記到最後一個關閉標記,包括註釋和<tr>標記之間的任何無效代碼。爲了解決這個問題,通過附加一個?來使得量詞懶。

見我的解決方案(在JavaScript中, jQuery的)位置:

http://jsfiddle.net/TpeEj/2/

相關問題