html中正則匹配img


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(".") + 1);
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 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 2.直接改成將字節寫入文件的方式處理;解決問題。
12    var bytes = Convert.FromBase64String(base64Str);
13     File.WriteAllBytes(imgPath, bytes);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM