2015-10-15 70 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/在程序:)