C# HTML帮助类 包括补全标签 截取HTML字符串包含标签
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字符串包含标签的更多相关文章
- Visual Studio Code快速补全html标签(Sublime同样支持)
1.生成html文件骨架 输入"!" 或 "html:5",按tab键 注意:编写中文网页,记得把头部语言<html lang="en" ...
- QLineEdit拾遗:数据的过滤、验证和补全
QLineEdit是使用频率最高的控件之一,当我们想获取用户输入时自然而然得会用到它. 通常我们会将QLineEdit的信号或其他控件的信号绑定至槽函数,然后获取并处理编辑器内的数据.你会觉得我们拿到 ...
- vim之补全2(完全个人定制版)
关于补全的方面要说的的确很多, 这里选择分为两个章叙述. 如果你想学vim, 你需要有很强的耐心, 如果你想锻炼这种耐心, 你可以试着先看完我之前的文章. 好了, 下面继续我们的vim补全吧. vim ...
- Linux命令之tab 键补全
tab 键补全 tab 键可以实现命令及路径等补全,提高输入效率,避免出错 命令补全 用户给定的字符串只有一条惟一对应的命令,直接补全, 两次Tab会给出列表 内部命令: 外部命令:bash根据PAT ...
- 网页内容的html标签补全和过滤的两种方法
网页内容的html标签补全和过滤的两种方法: 假设你的网页内容的html标签显示不全,有些表格标签不完整而导致页面混乱,或者把你的内容之外的局部html页面给包括进去了,我们能够写个函数方法来补全ht ...
- Python Beautiful Soup学习之HTML标签补全功能
Beautiful Soup是一个非常流行的Python模块.该模块可以解析网页,并提供定位内容的便捷接口. 使用下面两个命令安装: pip install beautifulsoup4 或者 sud ...
- php实现网页标签补全方法(转)
导读:PHP在生成静态文件的时候,有时候会因为一些混编问题让HTML标签不完整或混乱而导致页面混乱.作者分享下面这段小代码可以非常方便解决问题. 如果你的网页内容的html标签显示不全,有些表格标签不 ...
- php实现网页HTML标签补全方法
如果你的网页内容的html标签显示不全,有些表格标签不完整而导致页面混乱,或者把你的内容之外的局部html页面给包含进去了,我们可以写个函数方法来补全html标签以及过滤掉无用的html标签. php ...
- 设置Eclipse的类文件和xml文件代码自动补全
原文:https://blog.csdn.net/erlian1992/article/details/53706736 我们在平常编写代码的时候,不会记住大多数的类和文件的属性,方法等等,这就需要我 ...
随机推荐
- 5w 字 | 172 图 | 超级赛亚级 Spring Cloud 实战
一.PassJava 项目简介 PassJava-Learning 项目是 PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. PassJava 是一款 Java 面试刷题 的 ...
- Java 安全之Java Agent
Java 安全之Java Agent 0x00 前言 在前面发现很多技术都会去采用Java Agent该技术去做实现,比分说RASP和内存马(其中一种方式).包括IDEA的这些破解都是基于Java A ...
- 20200311_最新爬取mzitu
废话不多, 直接上代码, python3.6: import requests from bs4 import BeautifulSoup import os import time; import ...
- requests请求高德地图api
高德地图通过GET方式发送url请求数据.url里需要包含开发者key以及一些请求的具体参数.(详情可见高德官网)高德返回的数据默认为JSON格式,方便处理. 顺带来回忆一下requests模块的一些 ...
- 第5.4节 Python函数中的变量及作用域
一.函数中的变量使用规则 函数执行时,使用的全局空间是调用方的全局空间,参数及函数使用的局部变量存储在函数单独的局部名字空间内: 函数的形参在函数中修改了值时,并不影响调用方本身的数据,但如果形参是一 ...
- 第4.4节 Python解析与推导:列表解析、字典解析、集合解析
一. 引言 经过前几个章节的介绍,终于把与列表解析的前置内容介绍完了,本节老猿将列表解析.字典解析.集合解析进行统一的介绍. 前面章节老猿好几次说到了要介绍列表解析,但老猿认为涉及知识层面比较多 ...
- PyQt(Python+Qt)学习随笔:QHeaderView.ResizeMode取值及含义
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 关于ResizeMode的使用请参考<PyQt(Python+Qt)学习随笔:QTableWi ...
- PyQt学习随笔:ListView控件增加列表项
ListView控件如果需要增加列表项,就是在对应数据存储中插入项,这又分两种情况,一种是已知列表数据存储,一种是未知数据存储.如果是未知数据存储,可以通过: ListView控件名.model() ...
- 攻防世界 web进阶区 lottery
首先进入题目的页面. 按其要求登录.然后看到以下界面. 御剑扫描目录,发现了robots.txt (robots协议) ,进入查看 进入.git/目录,用神器 GitHack 下载文件. 然后查看源码 ...
- 安装centos出现的问题
1.配置好之后,点击完成,如果出现"无法创建新虚拟机,无法打开配置文件,D:/... ,拒绝访问" 的错误时: 关闭虚拟机,重新以管理员身份打开.