html中正则匹配img
1.正则匹配html中的img标签,取出img的url并进行图片文件下载;
/// <summary>
/// 将image标签的src属性的url替换为base64
/// </summary>
/// <param name="questionHtml"></param>
/// <returns>返回替换imgurl后的questionHtml</returns>
public string GetBase64ImgHtml(string questionHtml)
{
//获取<question></question>标签[获取某个标签时的表达式]
// Regex regQuestion = new Regex(@"<question\b*[^<>]*?\b[\s\S]*>([\s\S]*)</question>", RegexOptions.IgnoreCase); string retHtml = string.Empty;
//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);
//去掉分组中的 \s 防止图片的链接中含有空格导致匹配的url不全的问题
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);
// 搜索匹配的字符串
MatchCollection matches = regImg.Matches(questionHtml);
var list = new List<string>(); // 取得匹配项列表,并逐一替换成imgUrl
foreach (Match match in matches)
{
try
{
string imgUrl = match.Groups["imgUrl"].Value;
string imgType = imgUrl.Substring(imgUrl.LastIndexOf(".") + );
WebClient webClient = new WebClient();
Byte[] imgBytes = webClient.DownloadData(imgUrl);
string imgBase64Data = Convert.ToBase64String(imgBytes);
questionHtml = questionHtml.Replace(imgUrl, $"data:image/{imgType};base64,{imgBase64Data}");
}
catch (Exception ex)
{
continue;
}
} return questionHtml;
}
通过以上方法,就可以轻松将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。
.通过这种方式,部分 png 图片转存时会报错:参数无效
var bytes = Convert.FromBase64String(base64Str);
using(var ms = new System.IO.MemoryStream(bytes, true)){
//var bitmap = new Bitmap(ms);
var bitmap =Image.FromStream();
bitmap.Save(imgPath);
bitmap.Dispose();
ms.Close();
} .直接改成将字节写入文件的方式处理;解决问题。
var bytes = Convert.FromBase64String(base64Str);
File.WriteAllBytes(imgPath, bytes);
html中正则匹配img的更多相关文章
- JS中正则匹配的三个方法match exec test的用法
javascript中正则匹配有3个方法,match,exec,test: match是字符串的一个方法,接收一个RegExp对象做为参数: match() 方法可在字符串内检索指定的值,或找到一个或 ...
- 关于php中正则匹配包括换行符在内的任意字符的问题总结
要使用正则匹配任意字符的话,通常有以下几种方法,这里我分别对每一种方法在使用的过程中做一个总结: 第一种方式:[.\n]*? 示例 ? PHP preg_match_all('/<div cla ...
- Python中正则匹配使用findall时的注意事项
在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下. 比如说有一个字符串 "123@qq.comaaa@163.combbb@126.comasdf111@a ...
- Python中正则匹配使用findall,捕获分组(xxx)和非捕获分组(?:xxx)的差异
转自:https://blog.csdn.net/qq_42739440/article/details/81117919 下面是我在用findall匹配字符串时遇到的一个坑,分享出来供大家跳坑. 例 ...
- python中正则匹配之re模块
Python中正则表达式 re:re是提供正则表达式匹配操作的模块 一.什么是正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某个模式匹配,Python 自1.5版本起 ...
- JavaScript 中正则匹配时结果不一致的问题
创建示例项目 考察如下场景,我们有个输入框组件,输入时同时进行校验. interface IInputProps { label: string; } function Input({ label } ...
- grep中正则匹配的使用
如要匹配Computer或computer两个单词,可做如下操作: [Cc]mputer “.”允许匹配ASCII集中任意字符,或为字母,或为数字. 使用\{\}匹配模式结果出现的次数 匹配字母A出现 ...
- Java中正则匹配性能测试
工作中经常会用到在文本中每行检索某种pattern,刚才测试了三种方式,发现实际性能和预想的有区别 方式1: 直接字符串的matches方法,[string.matches("\\d+&qu ...
- JS中正则匹配开头不带空格,结尾也不带空格的字符串
在做项目的时候,要求限制SSID的长度.以及开头和结尾不能是空格. var reg = /^\S.{0,30}\S$/ "$$$ $$".match(reg); ==> ...
随机推荐
- jeecg中获取用户拥有的角色的数据权限
String roles1=""; String sql=""; //1.获取用户 TSUser user = ResourceUtil.getSessionU ...
- C之交换数据案例
//值传递 void swap(int i,int j){ printf("交换后:\n "); int tmp; tmp = i; i = j; j = tmp; } //引用传 ...
- Connection
作用: * 获取执行sql语句对象 ** createStatement(): 获取Statement对象 ** prepareStatement(String sql): 获取预处理对象 ** pr ...
- SqlServer2008数据库的备份与还原
1.先是备份数据 1.1.登录sql server management studio 1.2.选中需要备份数据库,右击鼠标,如下图: 1.3.点击备份之后,如下图; 2.数据还原准备 ps: 在开始 ...
- .net framework 4.0 安装失败解决办法
方法一 1.打开cmd命令窗口 运行net stop WuAuServ 停止更新服务 2.开始----运行------输入%windir% 3.找到SoftwareDistribution的 ...
- php微信支付企业付款到零钱报错call faild, errorCode:58
这个报错一般是自己证书目录不是绝对目录,正确的目录结构应该是网站根目录下的:“C:\PHPWAMP_IN1\wwwroot\XXXX\XXXX.pem”. 还要注意的是文件夹命名一定 ...
- 记录下关于RabbitMQ常用知识点(持续更新)
1.端口及说明: 4369 -- erlang发现口 5672 --client端通信口 15672 -- 管理界面ui端口 25672 -- server间内部通信口 举例说明 我们访问Rabbit ...
- 教程2:如何找到内存泄漏dotmemory
在本教程中,我们将看到如何使用dotmemory定位和固定在你的应用程序的内存泄漏.但在开始之前,让我们在一个内存泄漏是一致的. 内存泄漏是什么? 根据维基百科,内存泄漏是由于不正确的内存管理时,”一 ...
- du 和 df命令
测试环境数据库收到磁盘报警时,需要清理部分磁盘空间 df -h 查看整个磁盘占有 找到对应目录 查看每个文件夹占有磁盘量: sudo du -h --max-depth=1 data/ --max-d ...
- javaGuide_类文件结构
一 概述 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机.Java 语言通过字节码的方式,在一定程度上解决了传统解释型 ...