c# - 遍历 html 字符串以查找所有 img 标签并替换 src 属性值

标签 c# regex string image

我有一个 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=[\"'](.+?)[\"'].*?>", @"<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

希望对你有帮助

关于c# - 遍历 html 字符串以查找所有 img 标签并替换 src 属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39785600/

相关文章:

c# - 通过文本在 Linq 中选择列名

C# owin web api路由索引页面

regex - 尽管在 Linux 中使用了 "[ ]"(转义序列),但在 egrep 中使用 "\"时获得了特殊的结果

c# - DataTable的Row's First Column to String Array

regex - 如何至少匹配包含每个元音的单词一次?

java - 匹配 INI 节 block

c# - 具有特定要求的拆分字符串

c - asprintf - 如何在 C 中获取字符串输入

python - 将 IP 地址从长整型格式转换为字符串

c# - 如何在 win 8 中以编程方式在 C# 中按 Alt+Tab