2010-11-25 63 views
1

早上好TR正則表達式只提取與陣

我試圖得到一個錶行(TR),必須有一個或多個表單元格(TDS):

有了這個字符串

<TABLE> 
<TR valign="top"> 
    <TH>First</TH> 
    <TH>2nd</TH> 
    <TH>3rd</TH> 
    <TH>4th</TH> 
</TR> 
<TR valign="top"> 
    <TD width="15%">Michael Jackson</TD> 
    <TD width="5%">Cramberries</TD> 
    <TD width="25%">Pixies</TD> 
    <TD width="45%">The Ramones</TD> 
</TR> 
</TABLE> 

我想獲得:

<TR valign="top"> 
    <TD width="15%">Michael Jackson</TD> 
    <TD width="5%">Cramberries</TD> 
    <TD width="25%">Pixies</TD> 
    <TD width="45%">The Ramones</TD> 
</TR> 

什麼是最好的方式提取一個或一個以上的TR嵌套陣?

+2

`你不可使用正則表達式解析HTML`。在您的語言中使用一些DOM操作庫。 – 2010-11-25 11:31:14

+0

@Jan它在C#中用於解析HTML字符串 – 2010-11-25 12:04:27

+0

請參閱此答案http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 #1732454 – 2010-11-25 12:37:28

回答

1

這一個是工作

Regex.Matches(sourceHtmlString, @"(?<1><TR[^>]*>\s*<td.*?</tr>)", 
       RegexOptions.Singleline | RegexOptions.IgnoreCase) 
1

<tr(\s[^>*)?>.*?<td(\s[^>]*)?>.*?</tr(\s[^>]*)?>應該工作,但設置不區分大小寫和多行標誌。

但我完全同意Jan的評論。使用一個html解析器,這將更加健壯和可讀。

-1

這不是正則表達式會做的事情。例如,試圖將您的文字與<tr[^>]*>.*?<td[^>]*>.*?</tr>相匹配的行將匹配<th>行和第一行<td>行。您應該先匹配行,然後嘗試搜索每行<td>

或者更好的是,使用HTML解析器。 HTML不是regular language,不能用正則表達式真正解析。

0

這究竟在哪裏跑呢?如果你在瀏覽器中運行這個,在Javascript中,有比正則表達式更好的方法(例如tr上的jQuery選擇器:以(td)爲例)

如果你正在服務器端運行它,側面環境,例如PHP,正則表達式可以工作。

喜歡的東西:(] +>?)

原因,我暗示,而不是別的什麼 - 你想要得到的全部內容,所以包裹在括號中的整個事情,TR和TD可能會或可能沒有寬度,從不傷害以確定這樣的事情。

The。*?建設應該在大多數正則表達式引擎不貪婪,所以匹配符合最小的字符串 - 這應該阻止匹配。仍然需要設置多行和不區分大小寫,通常是m和i。 (但我沒有測試過)

但正如robert指出的那樣,在服務器端,合適的HTML解析器會更好,DOM或XML擴展應該能夠處理它。