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(/(^ ...
随机推荐
- go语言中make和new有什么作用以及区别?
在Go语言中,make 和 new 是两个内置的函数(built-in functions),用于分配内存,但它们之间有显著的区别,主要体现在它们被用于不同类型的对象分配内存. new new关键字用 ...
- KGDB调试Linux内核与模块
前言 内核 5.10 版本 openEuler 使用 yum install 下载了源码,并且通过两个 VMware 虚拟机进行调试 ubuntu 直接使用 git 拉取了https://kernel ...
- ArrayBlockingQueue的put方法底层原理
一.ArrayBlockingQueue的put方法底层原理 ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个基于数组实现的有界阻塞队 ...
- jmeter跨线程组传参的方法
Jmeter线程组下脚本,当设置好线程数后,该组下所有脚本均会执行对应的次数 测试场景: 1,后台登录新建拼团活动 2,获取拼团ID 3,多个会员前端登录,传入拼团ID参加拼团活动 要实现上面的测试场 ...
- 云备份技术解析:备份删除&合并原理
本文分享自天翼云开发者社区<云备份技术解析:备份删除&合并原理>,作者:沈****军 在删除备份副本时,需要根据备份副本包含的数据块以及数据块的引用关系来进行空间的释放.当云硬盘的 ...
- 20241106,LeetCode 每日一题,用 Go 实现整数回文数判断
题目 给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数.* 例如,121 是回文,而 123 不 ...
- stackbd:在一个块设备上堆叠另一个块设备
stackbd 是一个虚拟的块设备,它作为另一个块设备的前端,如 USB 闪存盘或循环设备.它将I/O请求传递给底层设备,同时它打印请求信息用于调试.它还有可能修改请求. 堆叠块设备(stackbd) ...
- C#高性能开发之类型系统:从C# 7.0 到C# 14的类型系统演进全景
自C# 7.0以来,C#语言在类型系统方面引入了众多新数据类型.类型构造和语言特性,以提升性能.类型安全性和开发效率.本文全面整理了从C# 7.0到C# 14.0(截至2025年4月,C# 14.0为 ...
- GC垃圾收集时,居然还有用户线程在奔跑
之前面试被问到过"当GC垃圾收集时,是所有的用户线程都停止了吗?",这一篇我们来探究一下这个问题. 其实执行本地代码的线程仍然可以运行,那么这些线程一旦改变了对象中的引用关系或创建 ...
- LLM Agent的构建:OpenAI官方指南解读
本文是对 OpenAI 近期发布的<A Practical Guide to Building Agents>的读后感与总结 Agent火爆的背景 大型语言模型(LLM)处理复杂.多步骤任 ...