public static class HtmlHelper
{
/// <summary>
/// 按文本内容长度截取HTML字符串(支持截取带HTML代码样式的字符串)
/// </summary>
/// <param name="html">将要截取的字符串参数</param>
/// <param name="len">截取的字节长度</param>
/// <param name="endString">字符串末尾补上的字符串</param>
/// <returns>返回截取后的字符串</returns>
public static string HTMLSubstring(string html, int len, string endString)
{
if (string.IsNullOrEmpty(html) || html.Length <= len) return html;
MatchCollection mcentiry, mchtmlTag;
ArrayList inputHTMLTag = new ArrayList();
string r = "", tmpValue;
int rWordCount = 0, wordNum = 0, i = 0;
Regex rxSingle = new Regex("^<(br|hr|img|input|param|meta|link)", RegexOptions.Compiled | RegexOptions.IgnoreCase)//是否单标签正则
, rxEndTag = new Regex("</[^>]+>", RegexOptions.Compiled)//是否结束标签正则
, rxTagName = new Regex("<([a-z]+)[^>]*>", RegexOptions.Compiled | RegexOptions.IgnoreCase)//获取标签名正则
, rxHtmlTag = new Regex("<[^>]+>", RegexOptions.Compiled)//html标签正则
, rxEntity = new Regex("&[a-z]{1,9};", RegexOptions.Compiled | RegexOptions.IgnoreCase)//实体正则
, rxEntityReverse = new Regex("§", RegexOptions.Compiled)//反向替换实体正则
;
html = html.Replace("§", "§");//替换字符§为他的实体“§”,以便进行下一步替换
mcentiry = rxEntity.Matches(html);//收集实体对象到匹配数组中
html = rxEntity.Replace(html, "§");//替换实体为特殊字符§,这样好控制一个实体占用一个字符
mchtmlTag = rxHtmlTag.Matches(html);//收集html标签到匹配数组中
html = rxHtmlTag.Replace(html, "__HTMLTag__");//替换为特殊标签
string[] arrWord = html.Split(new string[] { "__HTMLTag__" }, StringSplitOptions.None);//通过特殊标签进行拆分
wordNum = arrWord.Length;
//获取指定内容长度及HTML标签
for (; i < wordNum; i++)
{
if (rWordCount + arrWord[i].Length >= len) r += arrWord[i].Substring(0, len - rWordCount) + endString;
else r += arrWord[i];
rWordCount += arrWord[i].Length;//计算已经获取到的字符长度
if (rWordCount >= len) break;
//搜集已经添加的非单标签,以便封闭HTML标签对
if (i < wordNum - 1)
{
tmpValue = mchtmlTag[i].Value;
if (!rxSingle.IsMatch(tmpValue))
{ //不是单标签
if (rxEndTag.IsMatch(tmpValue) && inputHTMLTag.Count > 0) inputHTMLTag.RemoveAt(inputHTMLTag.Count - 1);
else inputHTMLTag.Add(tmpValue);
}
r += tmpValue;
} }
//替换回实体
for (i = 0; i < mcentiry.Count; i++) r = rxEntityReverse.Replace(r, mcentiry[i].Value, 1);
//封闭标签
for (i = inputHTMLTag.Count - 1; i >= 0; i--) r += "</" + rxTagName.Match(inputHTMLTag[i].ToString()).Groups[1].Value + ">";
return r;
} /// <summary>
/// 过滤html格式
/// </summary>
/// <param name="Htmlstring"></param>
/// <returns></returns>
public static string NoHTML(this string Htmlstring)
{
Htmlstring = Regex.Replace(Htmlstring, @"<script[\s\S]*?</script>", "", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"<noscript[\s\S]*?</noscript>", "", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"<style[\s\S]*?</style>", "", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"<.*?>", "", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"<(.[^>]*)>", " ", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"([\r\n])[\s]+", " ", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"-->", " ", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"<!--.*", " ", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"&(quot|#34);", "\"", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"&(amp|#38);", "&", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"&(lt|#60);", "<", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"&(gt|#62);", ">", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"&(nbsp|#160);", "", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"&(iexcl|#161);", "\xa1", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"&(cent|#162);", "\xa2", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"&(pound|#163);", "\xa3", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"&(copy|#169);", "\xa9", RegexOptions.IgnoreCase);
Htmlstring = Regex.Replace(Htmlstring, @"&#(\d+);", " ", RegexOptions.IgnoreCase);
return Htmlstring;
} /// <summary>
/// 去除html标签后并截取字符串
/// </summary>
/// <param name="html">源html</param>
/// <param name="length">截取长度</param>
/// <returns></returns>
public static string RemoveHtmlTag(this string html, int length = 0)
{
var doc = new HtmlDocument();
doc.LoadHtml(html);
var strText = doc.DocumentNode.InnerText;
if (length > 0 && strText.Length > length)
{
return strText.Substring(0, length);
} return strText;
} /// <summary>
/// 补全HTMl标签
/// </summary>
/// <param name="html">源html</param>
/// <param name="length">截取长度</param>
/// <returns></returns>
public static string GetHtmlTag(this string html)
{
var doc = new HtmlDocument();
doc.LoadHtml(html);
var strText = doc.DocumentNode.InnerHtml;
return strText;
} /// <summary>
/// 转换为HtmlDecode
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string HtmlDecode(this string value)
{
return System.Net.WebUtility.HtmlDecode(value);
}
/// <summary>
/// 转换为HtmlEncode
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string HtmlEncode(this string value)
{
return System.Net.WebUtility.HtmlEncode(value);
}
}

C# HTML帮助类 包括补全标签 截取HTML字符串包含标签的更多相关文章

  1. Visual Studio Code快速补全html标签(Sublime同样支持)

    1.生成html文件骨架 输入"!" 或 "html:5",按tab键 注意:编写中文网页,记得把头部语言<html lang="en" ...

  2. QLineEdit拾遗:数据的过滤、验证和补全

    QLineEdit是使用频率最高的控件之一,当我们想获取用户输入时自然而然得会用到它. 通常我们会将QLineEdit的信号或其他控件的信号绑定至槽函数,然后获取并处理编辑器内的数据.你会觉得我们拿到 ...

  3. vim之补全2(完全个人定制版)

    关于补全的方面要说的的确很多, 这里选择分为两个章叙述. 如果你想学vim, 你需要有很强的耐心, 如果你想锻炼这种耐心, 你可以试着先看完我之前的文章. 好了, 下面继续我们的vim补全吧. vim ...

  4. Linux命令之tab 键补全

    tab 键补全 tab 键可以实现命令及路径等补全,提高输入效率,避免出错 命令补全 用户给定的字符串只有一条惟一对应的命令,直接补全, 两次Tab会给出列表 内部命令: 外部命令:bash根据PAT ...

  5. 网页内容的html标签补全和过滤的两种方法

    网页内容的html标签补全和过滤的两种方法: 假设你的网页内容的html标签显示不全,有些表格标签不完整而导致页面混乱,或者把你的内容之外的局部html页面给包括进去了,我们能够写个函数方法来补全ht ...

  6. Python Beautiful Soup学习之HTML标签补全功能

    Beautiful Soup是一个非常流行的Python模块.该模块可以解析网页,并提供定位内容的便捷接口. 使用下面两个命令安装: pip install beautifulsoup4 或者 sud ...

  7. php实现网页标签补全方法(转)

    导读:PHP在生成静态文件的时候,有时候会因为一些混编问题让HTML标签不完整或混乱而导致页面混乱.作者分享下面这段小代码可以非常方便解决问题. 如果你的网页内容的html标签显示不全,有些表格标签不 ...

  8. php实现网页HTML标签补全方法

    如果你的网页内容的html标签显示不全,有些表格标签不完整而导致页面混乱,或者把你的内容之外的局部html页面给包含进去了,我们可以写个函数方法来补全html标签以及过滤掉无用的html标签. php ...

  9. 设置Eclipse的类文件和xml文件代码自动补全

    原文:https://blog.csdn.net/erlian1992/article/details/53706736 我们在平常编写代码的时候,不会记住大多数的类和文件的属性,方法等等,这就需要我 ...

随机推荐

  1. ECS服务器快速迁移

    ECS服务器快速迁移 前提 一.停机 二.创建镜像 三.复制镜像 前提 服务器都在同一个区域,举例:华南1(深圳) 同一个账号 具体迁移步骤如下: 一.停机 先从阿里云ECS控制台,将要迁移的两台EC ...

  2. pycharm2020激活破解和汉化

    一:破解补丁和程序下载:链接:https://pan.baidu.com/s/1u-aZrKMmfRBlQHtcivUt8Q    提取码:tvko 二:破解步骤: 1.安装下载的pycharm202 ...

  3. 15.java设计模式之访问者模式

    基本需求: 电脑需要键盘鼠标等固定的组件组成 现在分为个人,组织等去买电脑,而同一种组件对不同的人(访问者)做出不同的折扣,从而电脑的价格也不一样 传统的解决方法:在组件内部进行判断访问人的类型,从而 ...

  4. 基于gin的golang web开发:docker

    Golang天生适合运行在docker容器中,这得益于:Golang的静态编译,当在编译的时候关闭cgo的时候,可以完全不依赖系统环境. 一些基础 测试容器时我们经常需要进入容器查看运行情况,以下命令 ...

  5. F - LCS 题解(最长公共子序列记录路径)

    题目链接 题目大意 给你两个字符串,任意写出一个最长公共子序列 字符串长度小于3e3 题目思路 就是一个记录路径有一点要注意 找了好久的bug 不能直接\(dp[i][j]=dp[i-1][j-1]+ ...

  6. SpringBoot中JPA的学习

    SpringBoot中JPA的学习 准备环境和项目配置 写一下学习JPA的过程,主要是结合之前SpringBoot + Vue的项目和网上的博客学习一下. 首先,需要配置一下maven文件,有这么两个 ...

  7. 01_Activity生命周期及传递数据

    1. Activity的生命周期: 2. Activity启动另一个Activity,并传递数据: package com.example.activitydemo; import android.a ...

  8. Alpha冲刺——总结

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 ...

  9. 写给程序员的机器学习入门 (十) - 对象识别 Faster-RCNN - 识别人脸位置与是否戴口罩

    每次看到大数据人脸识别抓逃犯的新闻我都会感叹技术发展的太快了,国家治安水平也越来越好了

  10. 老猿学5G:融合计费基于流计费的触发器Triggers

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 每个触发条件都是一个可计费事件.SMF中的功能体CTF在用户上网时达到一定条件就会向CHF上报流量,而CTF什么时候触发流量上报是由CTF中的触发器 ...