c# – 遍历html字符串以查找所有img标记并替换src属性值
发布时间:2020-12-15 19:27:52 所属栏目:百科 来源:网络整理
导读:我有一个 HTML代码作为字符串.我需要在该字符串中找到所有img标记,读取每个src属性的值并将其传递给函数,该函数返回一个整个img标记,需要取代读取的img标记. 它需要遍历整个字符串并为所有img标记执行相同的逻辑. 例如,假设我的html字符串如下所示: string
我有一个
HTML代码作为字符串.我需要在该字符串中找到所有img标记,读取每个src属性的值并将其传递给函数,该函数返回一个整个img标记,需要取代读取的img标记.
它需要遍历整个字符串并为所有img标记执行相同的逻辑. 例如,假设我的html字符串如下所示: string htmlBody= "<p>Hi everyone</p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAA..." <p>I am here </p> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAC..." />" 我有以下代码,它找到第一个img标记,获取src值(这是一个base64字符串)并将其转换为一个位数组来创建一个流,然后我可以创建一个链接到该流的新src值. //Remove from all src attributes "data:image/png;base64" string res = Regex.Replace(htmlBody,"data:image/w+;base64,",""); //Match the img tag and get the base64 string value string matchString = Regex.Match(res,"<img.+?src=["'](.+?)["'].*?>",RegexOptions.IgnoreCase).Groups[1].Value; var imageData = Convert.FromBase64String(matchString); var contentId = Guid.NewGuid().ToString(); LinkedResource inline = new LinkedResource(new MemoryStream(imageData),"image/jpeg"); inline.ContentId = contentId; inline.TransferEncoding = TransferEncoding.Base64; //Replace all img tags with the new img tag htmlBody = Regex.Replace(htmlBody,@"<img src='cid:" + inline.ContentId + @"'/>"); 正如你可以看到finnaly我有新的img标签要替换: <img src='cid:" + inline.ContentId + @"'/> 但代码将使用相同的内容替换所有img标记.我需要能够获取img标记,执行逻辑,替换它然后继续下一个img标记. 希望你能告诉我如何做到这一点.提前致谢. 解决方法
如果我正确理解您的需要,您可以使用HtmlAgilityPack来实现此目的.使用正则表达式可能会导致不必要的行为你能试试下面的代码吗?
public static string DoIt() { string htmlString = ""; using (WebClient client = new WebClient()) htmlString = client.DownloadString("http://dean.edwards.name/my/base64-ie.html"); //This is an example source for base64 img src,you can change this directly to your source. HtmlDocument document = new HtmlDocument(); document.LoadHtml(htmlString); document.DocumentNode.Descendants("img") .Where(e => { string src = e.GetAttributeValue("src",null) ?? ""; return !string.IsNullOrEmpty(src) && src.StartsWith("data:image"); }) .ToList() .ForEach(x => { string currentSrcValue = x.GetAttributeValue("src",null); currentSrcValue = currentSrcValue.Split(',')[1];//Base64 part of string byte[] imageData = Convert.FromBase64String(currentSrcValue); string contentId = Guid.NewGuid().ToString(); LinkedResource inline = new LinkedResource(new MemoryStream(imageData),"image/jpeg"); inline.ContentId = contentId; inline.TransferEncoding = TransferEncoding.Base64; x.SetAttributeValue("src","cid:" + inline.ContentId); }); string result = document.DocumentNode.OuterHtml; } 您可以从https://www.nuget.org/packages/HtmlAgilityPack检索HtmlAgilityPack 希望这可以帮助 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |