2015-10-15 56 views
2

我解析一些html代碼,我試圖用它的src值(不帶後綴)替換img中的alt當且僅當alt是空的。如果符合條件,則用另一個正則表達式替換正則表達式的選擇

例子:

輸入:

... some HTML here .... 
<img src="my_image.jpg" alt="something_is_already_here" width="450" height="300"> 
... some HTML here .... 
<img src="my_image2.jpg" alt="" width="450" height="300" 

輸出:

... some HTML here .... 
<img src="my_image.jpg" alt="something_is_already_here" width="450" height="300"> 
... some HTML here .... 
<img src="my_image2.jpg" alt="my_image2" width="450" height="300"> 

我已經寫了src和中高音的正則表達式,但不知道如何使用它做我真正需要的東西。

//src=\"([^"]*)\.jpg\" 
string srcPattern = "src=\\\"([^\"]*)\\.jpg\\\""; 
//alt=\"([^"]*)\" 
string altPattern = "alt=\\\"([^\"]*)\\\""; 
Regex rSrc = new Regex(srcPattern); 
Regex rAlt = new Regex(altPattern); 
+0

什麼'img'標籤應該受到影響(第一個是不是,爲什麼只有第二個是) ?你爲什麼依賴於正則表達式來進行HTML解析?使用HtmlAgilityPack或任何其他HTML解析器。 –

+0

@stribizhev第一個不受影響導致alt的值不爲空。 – Dracke

回答

4

這裏是你如何可以用HTML解析器做使用前輕鬆地測試您正則表達式(HtmlAgilityPack - 安裝的NuGet包):您可以將URL或HTML字符串傳遞給HtmlAgilityPackPopulateAltWithSrcIfEmpty方法,並且輸出將是帶有img標籤中填充的alt的HTML字符串。

中的XPath使用//img[string-length(@alt) = 0]選擇所有img標籤(//img),其alt屬性值是空的([string-length(@alt) = 0])。

alt僅填充src的一部分,如果src值以.jpg擴展名結尾。然後,只有擴展前的部分用於設置alt屬性。

public string HtmlAgilityPackPopulateAltWithSrcIfEmpty(string html) 
    { 
     HtmlAgilityPack.HtmlDocument hap; 
     Uri uriResult; 
     if (Uri.TryCreate(html, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp) 
     { // html is a URL 
      var doc = new HtmlAgilityPack.HtmlWeb(); 
      hap = doc.Load(uriResult.AbsoluteUri); 
     } 
     else 
     { // html is a string 
      hap = new HtmlAgilityPack.HtmlDocument(); 
      hap.LoadHtml(html); 
     } 
     var nodes = hap.DocumentNode.SelectNodes("//img[string-length(@alt) = 0]"); 
     if (nodes != null) 
     { 
      foreach (var node in nodes) 
      { 
       var val = node.GetAttributeValue("src", string.Empty); 
       if (val.ToUpper().EndsWith(".JPG")) 
        node.SetAttributeValue("alt", val.Substring(0, val.Length - 4)); 
      } 
     } 
     var ffg = hap.DocumentNode.OuterHtml; 
     return hap.DocumentNode.OuterHtml; 
    } 

這樣使用它:

var s = "<img src=\"my_image.jpg\" alt=\"something_is_already_here\" width=\"450\" height=\"300\"><img src=\"my_image2.jpg\" alt=\"\" width=\"450\" height=\"300\">"; 
var new_html = HtmlAgilityPackPopulateAltWithSrcIfEmpty(s); 

結果:

<img src="my_image.jpg" alt="something_is_already_here" width="450" height="300"><img src="my_image2.jpg" alt="my_image2" width="450" height="300">

+0

我同意使用Agilitypack可能會更好,否則代碼看起來非常糟糕。 – Dracke

+2

否則,除了alt和src值之外,您還必須考慮其他許多事情。讓解析器爲你做「骯髒」的工作,你關注當你得到正確的節點時你真正需要達到什麼。正則表達式在這種情況下會導致你很大的痛苦和維護幾乎是不可能的。 –

-1

您需要使用Regex.Replace。 因爲你想在你的查找中替換一個不同的正則表達式,所以你需要使用一個if。

首先,您需要過濾掉與IMG-標籤全行要替換它的源泉,而不是任何的src;)

要使用正則表達式使用Regex.IsMatch(文字,圖案)進行過濾。

例子:

string text = Console.ReadLine(); 
string reg = @"^((([\w]+\.[\w]+)+)|([\w]+))@(([\w]+\.)+)([A-Za-z]{1,3})$"; 

if (Regex.IsMatch(text, reg)) 
{ 
    Console.WriteLine("Email."); 
} 

你讓爲IMG標記行模式,然後你走的更遠的IsMatch(imgLine,patternForAlt),並檢查它是否是空的,如果是你使用Replace(srcTag ,替換文字)。

如果您嘗試此操作並在您的嘗試中提供代碼(如果該操作無效),我可以進一步幫助您。

編輯

您可以使用https://regex101.com/在程序:)