1.正则匹配html中的img标签,取出img的url并进行图片文件下载;

  1. /// <summary>
  2. /// 将image标签的src属性的url替换为base64
  3. /// </summary>
  4. /// <param name="questionHtml"></param>
  5. /// <returns>返回替换imgurl后的questionHtml</returns>
  6. public string GetBase64ImgHtml(string questionHtml)
  7. {
  8. //获取<question></question>标签[获取某个标签时的表达式]
  9. // Regex regQuestion = new Regex(@"<question\b*[^<>]*?\b[\s\S]*>([\s\S]*)</question>", RegexOptions.IgnoreCase);
  10.  
  11. string retHtml = string.Empty;
  12. //Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);
  13. //去掉分组中的 \s 防止图片的链接中含有空格导致匹配的url不全的问题
  14. Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);
  15. // 搜索匹配的字符串
  16. MatchCollection matches = regImg.Matches(questionHtml);
  17. var list = new List<string>();
  18.  
  19. // 取得匹配项列表,并逐一替换成imgUrl
  20. foreach (Match match in matches)
  21. {
  22. try
  23. {
  24. string imgUrl = match.Groups["imgUrl"].Value;
  25. string imgType = imgUrl.Substring(imgUrl.LastIndexOf(".") + );
  26. WebClient webClient = new WebClient();
  27. Byte[] imgBytes = webClient.DownloadData(imgUrl);
  28. string imgBase64Data = Convert.ToBase64String(imgBytes);
  29. questionHtml = questionHtml.Replace(imgUrl, $"data:image/{imgType};base64,{imgBase64Data}");
  30. }
  31. catch (Exception ex)
  32. {
  33. continue;
  34. }
  35. }
  36.  
  37. return questionHtml;
  38. }

通过以上方法,就可以轻松将html中img标签转换为base64;

2.html中img标签中的base64转换为url

其实处理的思路都是一样的,正则匹配base64 的img也都基本一致(<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgData>[^""'<>]*)[^<>]*?/?[\s\t\r\n]*>)。但是此处还是值得记录一下。获取到img标签中的base64 字符串后,将其转存为本地图片的过程中,部分png格式图片转存失败,在用内存流初始化 BitMap 对象的时,一直报“参数无效错误”,但是用该种方式转存Jpg图片完全OK。

  1. .通过这种方式,部分 png 图片转存时会报错:参数无效
  2. var bytes = Convert.FromBase64String(base64Str);
  3. using(var ms = new System.IO.MemoryStream(bytes, true)){
  4. //var bitmap = new Bitmap(ms);
  5. var bitmap =Image.FromStream();
  6. bitmap.Save(imgPath);
  7. bitmap.Dispose();
  8. ms.Close();
  9. }
  10.  
  11. .直接改成将字节写入文件的方式处理;解决问题。
  12. var bytes = Convert.FromBase64String(base64Str);
  13. File.WriteAllBytes(imgPath, bytes);

html中正则匹配img的更多相关文章

  1. JS中正则匹配的三个方法match exec test的用法

    javascript中正则匹配有3个方法,match,exec,test: match是字符串的一个方法,接收一个RegExp对象做为参数: match() 方法可在字符串内检索指定的值,或找到一个或 ...

  2. 关于php中正则匹配包括换行符在内的任意字符的问题总结

    要使用正则匹配任意字符的话,通常有以下几种方法,这里我分别对每一种方法在使用的过程中做一个总结: 第一种方式:[.\n]*? 示例 ? PHP preg_match_all('/<div cla ...

  3. Python中正则匹配使用findall时的注意事项

    在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下. 比如说有一个字符串  "123@qq.comaaa@163.combbb@126.comasdf111@a ...

  4. Python中正则匹配使用findall,捕获分组(xxx)和非捕获分组(?:xxx)的差异

    转自:https://blog.csdn.net/qq_42739440/article/details/81117919 下面是我在用findall匹配字符串时遇到的一个坑,分享出来供大家跳坑. 例 ...

  5. python中正则匹配之re模块

    Python中正则表达式 re:re是提供正则表达式匹配操作的模块 一.什么是正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某个模式匹配,Python 自1.5版本起 ...

  6. JavaScript 中正则匹配时结果不一致的问题

    创建示例项目 考察如下场景,我们有个输入框组件,输入时同时进行校验. interface IInputProps { label: string; } function Input({ label } ...

  7. grep中正则匹配的使用

    如要匹配Computer或computer两个单词,可做如下操作: [Cc]mputer “.”允许匹配ASCII集中任意字符,或为字母,或为数字. 使用\{\}匹配模式结果出现的次数 匹配字母A出现 ...

  8. Java中正则匹配性能测试

    工作中经常会用到在文本中每行检索某种pattern,刚才测试了三种方式,发现实际性能和预想的有区别 方式1: 直接字符串的matches方法,[string.matches("\\d+&qu ...

  9. JS中正则匹配开头不带空格,结尾也不带空格的字符串

    在做项目的时候,要求限制SSID的长度.以及开头和结尾不能是空格. var reg = /^\S.{0,30}\S$/ "$$$  $$".match(reg);   ==> ...

随机推荐

  1. Linux学习:Makefile简介及模板

    一.基本概念介绍: Makefile 文件就是告诉make命令需要怎么样的去编译和链接程序. 编写Makefile的基本规则: 1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接. 2. ...

  2. ColorDrawable

    最简单的一种Drawable,当我们将ColorDrawable绘制到Canvas(画布)上的时候, 会使用一种固定的颜色来填充Paint,然后在画布上绘制出一片单色区域! 1).Java中定义Col ...

  3. 利用sorket实现聊天功能-服务端实现

    工具包 package loaderman.im.util; public class Constants { public static final String SERVER_IP = " ...

  4. 关于Java 8新引入语法特性的简要说明

    Java 8在语法上的主要改进就是新增了Lambda Expression以及Method Reference.由于官方网站的介绍稍显罗嗦,而且例子也有些复杂.我这里将提供一些更为浅显.直观的例子来帮 ...

  5. Qt编写数据可视化大屏界面电子看板6-窗体打开关闭

    一.前言 二级窗体的打开与关闭,这个功能也很有必要,由于整个系统中各种模块数量窗体数量比较多,后期可能还会增加更多,在4K屏幕上可以显示很多的模块,但是有时候有些模块不想显示出来,就需要将该模块关闭掉 ...

  6. php开启短标签与<?xml version="1.0" encoding="UTF-8"?>冲突

    前两天写了个生成mapsite的源码,想提交到百度和谷歌,在本地测试一点问题都没有,但是在服务器上就显示500错误 最后废了九牛二虎之力,终于可以设置iis直接显示出错信息. 也搞懂了问题所在,默认服 ...

  7. ubuntu 18.04安装ftp服务器

    首先安装vsftpd: sudo apt-get install vsftpd 可以通过命令vsftpd -version查看vsftpd版本. 为ftp服务器新建一个用户(比如我这里新建一个用户名和 ...

  8. EasyUI中对datagrid的扩展方法

    以下是给datagrid扩展一个方法的demo 1.给datagrid添加一个属性 $.extend($.fn.datagrid.defaults, { demo: "demo1" ...

  9. python、java、ruby、node等如何提取office文档中的内容?

    我相信大家都有过这样的需求,把doc.ppt.excel.pdf.txt中的文本内容提取出来.提取出来的文本内容可用于文档内容的全文索引,文档的基本内容摘要等.在度娘上搜索“如何提取文档内容”,确实有 ...

  10. Windows下直接双击可执行的jar

    如果没有设置,那么就是用命令行: jar处在文件夹路径下打开命令行:java -jar xxx.jar 总的来说是有点不方便 首先默认打开jar程序得是相同jdk的java.exe 然后是一闪而过 下 ...