2011-10-05 91 views
1

我需要獲取每行最後的</td>和關閉</tr>之間的所有標籤。我使用的正則表達式<\/TD\s*>(.*?)<\/TR\s*>檢索全部從第一個</TD>到最後</TR> - 在下面的示例中用粗體標記。獲取最後的</td></tr>正則表達式?

<TABLE> 
<TR><TD>TD11**</TD><TD>TD12</TD><TD>TD13</TD><SPAN><FONT>test1</FONT></SPAN></TR>** 
<TR><TD>TD21**</TD><TD>TD22</TD><TD>TD23</TD><SPAN><FONT>test2</FONT></SPAN></TR>** 
</TABLE> 

但我真正需要的是

<TABLE> 
<TR><TD>TD11</TD><TD>TD12</TD><TD>TD13**</TD><SPAN><FONT>test1</FONT></SPAN></TR>** 
<TR><TD>TD21</TD><TD>TD22</TD><TD>TD23**</TD><SPAN><FONT>test2</FONT></SPAN></TR>** 
</TABLE> 
+0

你能否澄清你想從該表中得到什麼? 「每行之間最後」是什麼意思? – Nobita

+2

Psst ... http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – driis

+1

如果你想要一個易於維護的解決方案,你不想爲此使用正則表達式。如果這只是一個個人編程練習,因爲比如爬山。而裸體和絆球的珠穆朗瑪峯對於你來說還不夠令人滿意,那麼試着使用正則表達式。但是,真的,你不想爲此使用正則表達式。 –

回答

2

它不建議使用正則表達式解析HTML,HTML嘗試使用正則表達式時,非經常和那裏非常不可靠。

繼承人好的博客文章,解釋的邏輯,並提供備選方案: http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html

+0

不幸的是,這並不能解決我的問題。我絕對同意這是個壞主意,但在Cope-Paste期間MS Word會返回此HTML,並且我需要刪除之間的此標記以使視圖看起來正確。而客戶不會使用JQuery。所以,這是一個很難解決的問題,將來會用更好的解決方案來替代。但現在我只需要在很多地方替換它,現在regEx是一個好方法。 – PARUS

1
</TD>((?:(?!</T[DR]>).)*)</TR> 

開始匹配在第一</TD>,但只要它到達第二</TD>因爲失敗的正則表達式(?!</T[DR]>).,它與任何不是</TD></TR>標記的第一個字符的字符相匹配。這是可選的,因爲包含(?:...)*,所以它會嘗試匹配正則表達式的下一部分,即</TR>。這也失敗了,所以比賽嘗試被放棄了。

它再次嘗試從第二個</TD>開始並再次失敗。最後,它開始匹配第三個</TD>併成功匹配從那裏到第一個</TR>

如果您的示例中沒有顯示換行符,您可能需要指定「單行」或「點匹配全部」模式。你沒有指定正則表達式的味道,所以我不能說如何做到這一點。

+0

謝謝。它像我需要的那樣工作。 – PARUS