2014-06-28 61 views
1

我想從下面的字符串,其中alt設置爲"thumbnail"提取「http://www.somewebsite.com/wanted.jpg」,並避免抓http://www.somewebsite.com/notwanted.jpg搶網址:如何從指定的alt標籤串

<span>Some information here 
    <div> 
    <img src="http://www.somewebsite.com/notwanted.jpg" width="15" height="15" alt="emoticon"> 
    <img src="http://www.somewebsite.com/wanted.jpg" alt="thumbnail"> 
    </div> 
</span> 

什麼是最簡單的方法去做?

+1

最簡單的方法? HTML敏捷包或類似的HTML解析器 - *不* RegEx。 – Tim

+0

@tim我會這樣做,但這是HTML Feed包無法處理的RSS源字符串的一部分,因爲它基於XML。我嘗試過,但無法完成工作。 –

+0

啊......另一種選擇可能是查看LINQ到XML,並以這種方式解析它 - 除非Feed的這個特定部分是CDATA。但在這種情況下,如果無法獲取HTML或XML解析器來處理它,RegEx *可能實際上更合適。 – Tim

回答

2

與所有有關使用正則表達式解析HTML的警告,這個C#正則表達式匹配的URL你想要的:

(?<=src=")[^"]+(?="[^">]*?alt="thumbnail") 

參見demo

要在C#測試:

var myRegex = new Regex("(?<=src=\")[^\"]+(?=\"[^\">]*?alt=\"thumbnail\")"); 
string resultString = myRegex.Match(s1).Value; 
Console.WriteLine(resultString); 

輸出:

http://www.somewebsite.com/wanted.jpg

說明

  • 的回顧後(?<=src=")斷言,什麼前面是src="
  • [^"]+比賽是不是所有的字符一個"(這就是我們想要的)
  • 先行(?="[^">]*?alt="thumbnail")斷言,接下來是一個報價,任何字符是不是一個報價或>接着`ALT = 「縮略圖」

參考, NCE

+0

這是有效的,但我不得不將它更改爲'Groups [0]':) –

+0

+1爲詳細的解釋和明確的警告解析XML/HTML與正則表達式的可怕想法... –

+0

@ChrisL那一定是一個小錯字,謝謝。 :)你實際上不需要'Groups [0]','myRegex.Match(s1).Value;'會做。 – zx81

0

你可以使用正則表達式如下拿到哪裏alt設置爲thumbnail的IMG SRC,

\"[^\"]*\"(?=\s*alt=\"thumbnail\") 

DEMO

如果您不希望出現在輸出的雙引號的你可以試試下面的正則表達式,

\"\K[^\"]*(?=\"\s*alt=\"thumbnail\") 

DEMO

說明:

  • \"\K \ķ丟棄先前匹配的人物,在我們的情況下,它丟棄了以前"標誌。
  • [^\"]*匹配任何不是雙引號的字符零次或多次。
  • (?=\"\s*alt=\"thumbnail\")正前瞻用來檢查字符串緊隨之後"必須"\s*alt="thumbnail"
0

假設你的字符串是htmlText您可以輕鬆地HtmlAgilityPack加載和不是執行選擇:

HtmlDocument html = new HtmlDocument(); 
html.LoadHtml(htmlText); 
var src = html.DocumentNode 
    .SelectSingleNode("//img[@alt='thumbnail']").GetAttributeValue("src",""); 
+0

這將是我的首選方式,但它無法加載XML提要 - 它只會崩潰。 –

+0

@ChrisL:旁註 - 在您的問題中,您的實際問題看起來幾乎爲零。您的示例顯示純HTML,但註釋中提到某種您無法加載的XML。也許你真正的問題是試圖讀無效的「XML」或不知道如何獲得特定節點的內部XML? –

相關問題