使用 HtmlAgilityPack 检测图像 src 中的数据 URI
Detect data URI in image src using HtmlAgilityPack
我处理了很多 html 并将其转换为 PDF 文件。在我可以转换我的 html 之前,我必须检测是否有任何图像是引用文件。如果它是一个引用文件,那么我会对其进行 base64 编码并用它替换 src。
现在我依靠 Regex 为我进行检测,但是由于我使用的是 HtmlAgilityPack,我想知道我是否可以使用 HtmlAgilityPack 实现相同的目的?
我想这样做,这样当我目前已经在使用 HtmlAgilityPack 时就不必维护 Regex。
所以现在我正在通过 RegEx 使用以下内容检测数据 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
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;
}
HtmlAgilityPack 没有内置函数来检测数据 URI,因此您仍然需要合并自己的此类函数实现。
顺便说一句,您可以使用 HtmlAgilityPack 的 LINQ API 到首先具有引用 src
属性的 select 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");
}
我处理了很多 html 并将其转换为 PDF 文件。在我可以转换我的 html 之前,我必须检测是否有任何图像是引用文件。如果它是一个引用文件,那么我会对其进行 base64 编码并用它替换 src。
现在我依靠 Regex 为我进行检测,但是由于我使用的是 HtmlAgilityPack,我想知道我是否可以使用 HtmlAgilityPack 实现相同的目的?
我想这样做,这样当我目前已经在使用 HtmlAgilityPack 时就不必维护 Regex。
所以现在我正在通过 RegEx 使用以下内容检测数据 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
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;
}
HtmlAgilityPack 没有内置函数来检测数据 URI,因此您仍然需要合并自己的此类函数实现。
顺便说一句,您可以使用 HtmlAgilityPack 的 LINQ API 到首先具有引用 src
属性的 select 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");
}