C# 使用HtmlAgilityPack检测图像src中的数据URI

C# 使用HtmlAgilityPack检测图像src中的数据URI,c#,base64,html-agility-pack,C#,Base64,Html Agility Pack,我处理大量html并将其转换为PDF文件。在转换html之前,我必须检测是否有任何图像是引用文件。如果它是一个被引用的文件,那么我将对它们进行base64编码,并用它替换src 现在我依靠正则表达式为我做检测,但是由于我使用了HtmlAgilityPack,我想知道我是否可以用HtmlAgilityPack实现同样的检测 我想这样做,这样当我目前已经在使用HtmlAgilityPack时,我就不必维护正则表达式了 现在,我通过正则表达式检测数据uri,如下所示: void Main() {

我处理大量html并将其转换为PDF文件。在转换html之前,我必须检测是否有任何图像是引用文件。如果它是一个被引用的文件,那么我将对它们进行base64编码,并用它替换src

现在我依靠正则表达式为我做检测,但是由于我使用了HtmlAgilityPack,我想知道我是否可以用HtmlAgilityPack实现同样的检测

我想这样做,这样当我目前已经在使用HtmlAgilityPack时,我就不必维护正则表达式了

现在,我通过正则表达式检测数据uri,如下所示:

void Main()
{
    var myHtml = @"<html><head></head><body><p><img src='data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs='/></p></body></html>";
    var htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(myHtml);

    var imgs = htmlDoc.DocumentNode.SelectNodes("//img");
    if (imgs != null && imgs.Count > 0)
    {
        foreach (var imgNode in imgs)
        {
            var srcAttribute = imgNode.Attributes.FirstOrDefault(a => string.Equals("src", a.Name, StringComparison.InvariantCultureIgnoreCase));

            if (!string.IsNullOrEmpty(srcAttribute?.Value) && !StringIsDataUri(srcAttribute.Value))
            {
                Console.WriteLine("BASE ENCODE THE REFERENCED FILE");
            }
        }
    }
}

//Regex from http://stackoverflow.com/a/5714355/1958344
private static Regex regex = new Regex(@"data:(?<mime>[\w/\-\.]+);(?<encoding>\w+),(?<data>.*)", RegexOptions.Compiled);

private bool StringIsDataUri(string stringToTest)
{
    var match = regex.Match(stringToTest);
    return match.Success;
}
void Main()
{
var myHtml=@“

”; var htmlDoc=新的HtmlDocument(); htmlDoc.LoadHtml(myHtml); var imgs=htmlDoc.DocumentNode.SelectNodes(“//img”); 如果(imgs!=null&&imgs.Count>0) { foreach(imgs中的var imgNode) { var srctattribute=imgNode.Attributes.FirstOrDefault(a=>string.Equals(“src”,a.Name,StringComparison.InvariantCultureIgnoreCase)); 如果(!string.IsNullOrEmpty(srctattribute?.Value)和&!StringIsDataUri(srctattribute.Value)) { WriteLine(“对引用文件进行基本编码”); } } } } //正则表达式来自http://stackoverflow.com/a/5714355/1958344 私有静态正则表达式Regex=newregex(@“数据:(?[\w/\-\.]+);(?\w+,(?*),RegexOptions.Compiled); 私有布尔字符串数据集(字符串stringToTest) { var match=regex.match(stringToTest); 回归比赛。成功; }
HtmlAgilityPack没有检测数据URI的内置函数,因此您仍然需要结合您自己的函数实现

另外,您可以使用HtmlAgilityPack的LINQ API来选择首先具有reference
src
属性的
img
元素:

var referenceImgs = htmlDoc.DocumentNode
                           .Descendants("img")
                           .Where(o => !StringIsDataUri(o.GetAttributeValue("src","")));

foreach(HtmlNode img in referenceImgs)
{
    Console.WriteLine("BASE ENCODE THE REFERENCED FILE");
}

好吧,这就是我所怀疑的。谢谢你的代码更新。你的版本比我的好看多了。