C# 去掉字符串中的html 标签,保留指定的标签和属性
/// <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;
}
C# 去掉字符串中的html 标签,保留指定的标签和属性的更多相关文章
- 正则匹配去掉字符串中的html标签
		
1.得到超链接中的链接地址: string matchString = @"<a[^>]+href=\s*(?:'(?<href>[^']+)'|"&quo ...
 - C++去掉字符串中首尾空格和所有空格
		
c++去掉首尾空格是参考一篇文章的,但是忘记文章出处了,就略过吧. 去掉首尾空格的代码如下: void trim(string &s) { if( !s.empty() ) { s.erase ...
 - C# 使用正则表达式去掉字符串中的数字,或者去掉字符串中的非数字
		
/// 去掉字符串中的数字 public static string RemoveNumber(string key) { ...
 - 三种java 去掉字符串中的重复字符函数
		
三种java 去掉字符串中的重复字符函数 public static void main(string[] args) { system.out.println(removerepeatedchar( ...
 - C# 使用正则表达式去掉字符串中的数字
		
/// <summary>/// 去掉字符串中的数字/// </summary>/// <param name="key"></param ...
 - 【PHP函数】PHP 去掉字符串中的转义符号
		
PHP字符串中的转义符号 string stripslashes ( string $str ) //去掉字符串中的反斜线字符.若是连续二个反斜线,则去掉一个,留下一个.若只有一个反斜线,就直接去掉.
 - C# .net 使用正则表达式去掉字符串中的数字
		
/// <summary>/// 去掉字符串中的数字/// </summary>/// <param name="key"></param ...
 - 《程序员代码面试指南》第五章 字符串问题 去掉字符串中连续出现k 个0 的子串
		
题目 去掉字符串中连续出现k 个0 的子串 java代码 package com.lizhouwei.chapter5; /** * @Description: 去掉字符串中连续出现k 个0 的子串 ...
 - php去掉字符串中的最后一个字符和汉字
		
###php去掉字符串中的最后一个字符和汉字 1.php去掉字符串中的最后一个字符: //方法一: $newstr = substr($str,0,strlen($str)-1); //方法二: $n ...
 - js去掉字符串中的所有空格
		
1.使用js去掉字符串中的所有空格 1.1.定义一个去空格函数方法 function Trim(str,is_global){ var result; result = str.replace(/(^ ...
 
随机推荐
- MySurvey 问卷调查, 一个简单的Biwen.QuickApi示例项目
			
MySurvey 项目 很久没更新我的博客了,之前开发的Biwen.QuickApi微框架 一直没有开发一个示例项目,最近有点时间,写了一个示例项目稍微介绍下 项目简介 这是一个基于 Biwen.Qu ...
 - P3392 涂国旗 题解
			
题目大意 题目真的是不说人话...... 有一个国家的国旗是由一个 N * M 的方格组成的.如果想要这面国旗合法,就必须满足要求: 国旗从上到下必须是白色.蓝色和红色,顺序不能改变. 每一种颜色都至 ...
 - 康谋方案 | 康谋BRICK2与车载以太网设备轻松集成
			
导读:在当下,汽车行业在安全性.舒适性.智能和万物互联等方面彻底改变了传统车辆的定义.随着这一趋势,汽车行业逐渐开始采用车载以太网来进行车内数据通讯,比如100Base-T1.1000Base-T1, ...
 - (倍增)LCA学习笔记+做题记录
			
LCA学习笔记 LCA指最长公共子序列,可以使用倍增的方法求解(复杂度较优) 步骤 (1) 预处理 a. 求深度: 对于每个结点 \(dfs\) 预处理出结点深度; b. 求倍增祖先: 计算出每个结点 ...
 - Windows上,10分钟构建一个本地知识库
			
这篇文章是我约新书<RAG应用实战>的一个样章,基于阿里云代码构建的一个本地RAG服务. 本地模型看代码注释,需要替换几行代码. 阅读本章时,已默认安装你的个人电脑上安装了Python 3 ...
 - SpringBoot内容协商(Content Negotiation)
			
内容协商 在 HTTP 协议中,内容协商是一种机制,用于为同一 URI 提供资源不同的表示形式,以帮助用户代理指定最适合用户的表示形式(例如,哪种文档语言.哪种图片格式或者哪种内容编码).[^1] S ...
 - Java编程--抽象类和接口的区别
			
No. 区别 抽象类 接口 1 关键字 abstract class interface 2 组成 构造方法.普通方法.抽象方法.static方法.常量.变量 抽象方法.全局常量 3 子类使用 cla ...
 - HarmonyOS Next实战教程:实现中间凹陷的异形tabbar
			
今天要和大家分享的实战案例是实现中间凹陷的tabar 前些天在做墨迹天气的时候看到了这种异形的tabbar,看起来比较有挑战性,因为鸿蒙版的墨迹天气app还没有这个东西,我决定尝试做一下. 系统的Ta ...
 - 掌握Node.js原理,开启异步编程之旅
			
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
 - Beautiful code and beautiful life
			
You may ask me why do i strive constantly, what i am striving for? Yep, the same question haunts me ...