C# 使用HtmlAgilityPack检测图像src中的数据URI
我处理大量html并将其转换为PDF文件。在转换html之前,我必须检测是否有任何图像是引用文件。如果它是一个被引用的文件,那么我将对它们进行base64编码,并用它替换src 现在我依靠正则表达式为我做检测,但是由于我使用了HtmlAgilityPack,我想知道我是否可以用HtmlAgilityPack实现同样的检测 我想这样做,这样当我目前已经在使用HtmlAgilityPack时,我就不必维护正则表达式了 现在,我通过正则表达式检测数据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() {
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来选择首先具有referencesrc
属性的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");
}
好吧,这就是我所怀疑的。谢谢你的代码更新。你的版本比我的好看多了。