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(/(^ ...
随机推荐
- datasnap的restful服务器
说真话,这玩意真的简单好用.但你要控制好: 1.内存泄漏和异常处理好: 2.有没有发现,通过服务器对数据库进行读写时,在资源管理器中,如果是sql server,就会看到连接1433的连接一直挂在那里 ...
- study Rust-5【Slice】
另一个没有所有权的数据类型是 slice.slice 允许你引用集合中一段连续的元素序列,而不用引用整个集合. [字符串Slice熟悉掌握的很勉强,通过动手来进步加深认识] 字符串slice let ...
- shell处理字符串
概念 字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号. 单引号声明字符串 单引号里的任何字符都会原样输出, ...
- HTTP 分段下载
GET /user_crc.bin HTTP/1.1 Host: mnif.cn Range: bytes=0-1000
- 面试的信心来源于过硬的基础 viewport、跨域、 渲染优化、数组乱序、盒子垂直水平居中、meta、消除transition闪屏、JS 判断设备来源
原文:面试的信心来源于过硬的基础 在过去的一年很多人不满于公司没有福利.人际关系不好相处.没有发展前途的境遇等等,想着在开年来换一份工作来重新开始自己,那么 你 准备好了吗? 下面是本人整理的一份面试 ...
- 分享5款开源、美观的 WinForm UI 控件库
前言 今天大姚给大家分享5款开源.美观的 WinForm UI 控件库,助力让我们的 WinForm 应用更好看. WinForm WinForm是一个传统的桌面应用程序框架,它基于 Windows ...
- 【记录】Python3|Selenium 下载 PDF 不预览不弹窗(2024年)
版本: Chrome 124 Python 3.12 Selenium 4.19.0 版本与我有差异不要紧,只要别差异太大比如 Chrome 用 57 之前的版本了,就可以看本文. 如果你从前完全没使 ...
- 用AI开发AI翻译助手:初学者也能轻松做出第一个应用
在过去,学习编程往往意味着大量阅读文档.理解晦涩的语法.查找资料,甚至要面对一个接一个的报错信息,这对初学者来说常常是一个令人望而生畏的过程.但在AI时代,这一切都变得不一样了. 我最近完成了一个小项 ...
- LinqHelper拓展
public static class LinqHelper { //NHibernate.Hql.Ast.HqlBooleanExpression public static Expression& ...
- vivo 互联网研发效能关键技术与实践
作者: vivo 互联网研发效能团队 Yang Peng.Huang Fengjin 本文为2024年 vivo 开发者大会互联网技术专场分享内容之一,在公众号对话框回复[2024VDC]获取 202 ...