2016-08-09 23 views
-1

我知道這已被問到一些能力 - 但我還沒有看到解決方案的工作示例。我知道有Html敏捷包來解析HTML字符串,但我不希望下載/安裝它。我使用C#正則表達式來獲得兩個字符串之間的通配符字符串之間的字符串?

string html = client.DownloadString("http://yoursite.com/page.html"); 

我有一個標籤,其有一類與他們獲得一個網頁的內容,但其中的一些標籤也有自己的ID,或風格等,例如:

<td>I Dont want this</td> 
<td class="myClass">I want this</td> 
<td class="myClass" id="myID">I want this</td> 
<td style="border-top-width: 0px; class="myClass">I want this</td> 

我試圖

<td>(.*?)</td> 

但它返回的標籤,沒有任何類,ID等

我試過

<td class="myClass"[^>]*>(.*?)</td> 

但它只返回第二個和第三個<td>值,但不是第四個。如何添加通配符來返回<td>myClass,但忽略之前或之後發生的任何事情,如idstyle

+1

我不得不指出你[這個頗有名的問題](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – Jonesopolis

+0

部分HTML將始終具有問題指定的相同格式。瀏覽器不會自動完成和自動更正錯誤或重載。 – KingsInnerSoul

+0

只需在'class'屬性之前添加另一個'[^>] *'。如果你的HTML和你說的一致,那應該就足夠了。 –

回答

0

這隻會確定<td是否具有類或id屬性。
它通過,如果任何一個。

如果你只需要一類值和id是可選的,有條件的
更改爲(?(class)|(?!))

它找到的開始標記後,這種方法只是找到的第二天關閉。
注意,它不檢查如果開<td是一個自包含的標籤。
如果可能的話,原子團
即(?> ..)(?<!/>)之後添加(?<!/>)

類並且id值位於其命名的捕獲組中。

逐字

@"(?is)<td(?=\s)(?>(?:(?<=\s)class\s*=\s*""(?<class>[^""]*)""|(?<=\s)id\s*=\s*""(?<id>[^""]*)""|"".*?""|'.*?'|[^>]*?)+>)(?(class)|(?(id)|(?!))).*?</td\s*>"

擴展

(?is) 
< td     # 'td' tag, or any tag for that matter 
(?= \s) 
(?>     # Atomic grouping 
     (?: 
      (?<= \s) 
      class \s* = \s*  # 'class' attribute 
      " 
      (?<class>    # 'class' value              
       [^"]*     
      ) 
      " 
     | (?<= \s) 
      id \s* = \s*   # 'id' attribute 
      " 
      (?<id>     # 'id' value              
       [^"]* 
      ) 
      " 
     | " .*? " 
     | ' .*? ' 
     | [^>]*? 
    )+ 
     > 
) 
(?(class)    # Conditional - Only tags with our 'class' or 'id' attr/value 
    | 
     (?(id) 
     | (?!) 
    ) 
) 
.*? 
</td \s* > 

順便說一句,你的最後一行<td style="border-top-width: 0px; class="myClass">I want this</td>
風格值包圍類=部分
style="border-top-width: 0px; class="

0

應該這樣做:<td(.+|)(class="myClass")(.+|)>(.+)<\/td>

活生生的例子:https://regex101.com/r/gG6gH0/2

但如果該列表是任何不同的格式,然後你再說明您必須排除從「<」,「>」字符捕獲組。

相關問題