首页 > 编程语言 >C# 去掉字符串中的html 标签,保留指定的标签和属性

C# 去掉字符串中的html 标签,保留指定的标签和属性

时间:2024-05-16 16:23:19浏览次数:17  
标签:string C# 标签 tag html allowedTags new

 /// <summary>
 /// 使用示例
 /// </summary>
 public static void HtmlRemove() 
 {
     string requestBody = "<html><head><title>Test</title></head><body><a lay-her='123' href=\"https://example.com\">Link</a><p>Not allowed</p><span class=\"developer\"><img src=\"https://www.luocore.com/assets/logo-dark.be3794d7.png\">           <span>LuoCore</span></span><img lay-her='123' data-luo='222' src=\"图片路径\" data=\"test\" /> <a data-luo='222' href=\"baidu.com\" /> <div><span>测试标签</span><img src=\"https://pic.cnblogs.com/face/646489/20140908123308.png\" class=\"avatar\" alt=\"博主头像\"></div></body></html>";
     Dictionary<string, string[]> allowedTags = new Dictionary<string, string[]>()
                 {
                     { "a", new string[]{ "href", "data-luo" } },
                     { "img", new string[]{ "src", "lay-her", "data-luo" } }
                 };
     // 过滤HTML标签  
     string filteredRequestBody = HtmlRemoveTagsExcept(requestBody, allowedTags);
     Console.WriteLine(filteredRequestBody);
 }

 /// <summary>
 /// html 代码移除
 /// </summary>
 /// <param name="html"></param>
 /// <param name="allowedTags"></param>
 /// <returns></returns>
 public static string HtmlRemoveTagsExcept(string html, Dictionary<string, string[]> allowedTags)
 {
     // 预编译正则表达式以提高性能
     var tagsPattern = new Regex($"<(/?)(?!({string.Join("|", allowedTags.Keys)})(\\s|/?>))[^>]*>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
     var attributePatterns = allowedTags.ToDictionary(
         tag => tag.Key,
         tag => new Regex($@"\s+({string.Join("|", tag.Value.Select(attr => Regex.Escape(attr)))})\s*=\s*(['""][^'""]*['""])", RegexOptions.IgnoreCase | RegexOptions.Compiled)
     );

     // 移除不允许的标签
     string intermediateResult = tagsPattern.Replace(html, "");

     // 处理允许的标签,只保留允许的属性
     foreach (var tag in allowedTags.Keys)
     {
         string fullPattern = $"<{tag}(\\s[^>]*?)?(/?>)";
         intermediateResult = Regex.Replace(intermediateResult, fullPattern, match =>
         {
             string insideTag = match.Groups[1].Value;
             string tagClose = match.Groups[2].Value;
             string filteredAttributes = attributePatterns[tag].Matches(insideTag)
                 .Cast<Match>()
                 .Aggregate("", (current, attrMatch) => current + attrMatch.Value);

             return $"<{tag}{filteredAttributes}{tagClose}";
         }, RegexOptions.IgnoreCase);
     }

     // 移除多余的空格和修正属性格式
     intermediateResult = Regex.Replace(intermediateResult, @"\s{2,}", " ");
     intermediateResult = Regex.Replace(intermediateResult, @"<(\w+)(\s[^>]*?)?\s*(/?>)", "<$1$2$3");

     return intermediateResult;
 }

 

标签:string,C#,标签,tag,html,allowedTags,new
From: https://www.cnblogs.com/LuoCore/p/18196157

相关文章

  • NPOI Excel指定范围内插入图片(纵横比)
    NPOIExcel指定范围内插入图片(纵横比),考虑列宽,行高比。//Iassumeyouwanttoinserttheimageintotheworksheetloadedintheworkbookparameter//Youcanadjusttheratiovariableaccordinglytocontroltheratioofwidthandheight//Youcanalsoadjust......
  • DataX将MySql数据库数据同步到Oracle数据库
    1.下载DataX并解压(本地环境安装有python)DataX/userGuid.mdatmaster·alibaba/DataX(github.com) job文件夹下存放数据同步的json脚本{"job":{"setting":{"speed":{"channel":1}......
  • nginx: /lib64/libcrypt.so.1: version `XCRYPT_2.0' not found
    1.报错信息[root@ba6649b3a783sbin]#./nginx--t./nginx:/lib64/libcrypt.so.1:version`XCRYPT_2.0'notfound(requiredby./nginx)./nginx:/lib64/libc.so.6:version`GLIBC_2.27'notfound(requiredby./nginx)./nginx:/lib64/libc.so.6:version......
  • 小型无刷吸尘器pcba方案技术应用
    小型无刷吸尘器是一种完全颠覆传统手持吸尘器的技术,它不仅可以提高吸力、降低噪音,还可以实现电子调速、能量回收和远程控制等多种功能。有理由相信,小型无刷吸尘器的应用会彻底改变手持吸尘器的使用体验,并且对整个吸尘器行业产生深远的影响。小型无刷吸尘器采用的是电子调......
  • 【Cron表达式】小贴士
    表达式检测网站 CRON有如下两种语法格式:秒分小时日期月份星期年秒分小时日期月份星期字符含义示例*表示匹配域的任意值在分这个域使用*,即表示每分钟都会触发事件。?表示匹配域的任意值,但只能用在日期和星期两个域,因为这两个......
  • RDLC降低使用内存
    在Winform使用RDLC时,在批量打印情况下,内存随着打印任务的数量逐渐增加。即便手动GC效果也不明显。原因:localReport在创建时,每个实例都是一个应用程序域。租约的过期时间比较久,按照网上的资料,过期时间大约10分钟左右。这就导致即便打印完了,内存也不会很快下降。解决办法:1.手......
  • 已卸载Tuxera NTFS for Mac后仍在ntfs磁盘插入后仍有提示
    “Microsoft NTFS by Tuxeracouldnotvalidateyourproductkey.PleasecontactTuxera'semailsupportforhelp.”我之前安装过MicrosoftNTFS但是过期了,我就给它卸载了,但是每次插入u盘还是会弹出上面一行内容的提示框。于是我找到这个朋友发的[文章](https://zhuanla......
  • 【CodeChef】Prison Escape(最短路)
    题目大意:给出一个01矩阵,求每个0移动(每次可以向有公共边的格子移动一步)到矩阵边界至少要经过多少个1。考虑建最短路模型,将矩阵中的每个位置拆分为入点和出点,矩阵外部设为一个点。枚举矩阵中的每个位置:如果这个位置在矩阵边界,矩阵外部向这个位置的入点连一条长度为0的边。......
  • socketserver,操作系统了解
    Ⅰsocketserver【一】引入socket并不能多并发,只能支持一个用户socketserver模块是Python中用于创建网络服务器的模块,提供了一种简单而一致的接口。它是构建网络服务器的框架,处理了创建、维护和关闭连接的许多底层细节socketserver是socket的再封装【二】socke......
  • Leedcode-提莫攻击
    自己写的,中间算法有遗漏的遍历classSolution:deffindPoisonedDuration(self,timeSeries:List[int],duration:int)->int:ifduration==0:#如果duration为0,则返回0,因为没有中毒时间return0count=0#初始化中毒总时间......