求智能截断html的函数 就是指定限制长度,截取含html标签的文本的前面部分,如果有html闭合标签被截掉了,要求能自动补全网上搜索到一些,但是经测试都有些bug,有哪位用过的能推荐一下呢?谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 建议你用正则表达式 前提是有规律可寻 否则的话 你这个要判断所有的html标签 很麻烦实现的话 就是非常复杂才要求现成的可靠成品啊,我想应该有吧,其实这个需求在做web开发时候还是比较普遍需要用到了,例如对完整文章做摘要什么的。 1. #region 清除HTML标记 public static string DropHTML(string Htmlstring) { //删除脚本 Htmlstring = Regex.Replace(Htmlstring, @"<script[^>]*?>.*?</script>", "", RegexOptions.IgnoreCase); //删除HTML 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); Htmlstring.Replace("<", ""); Htmlstring.Replace(">", ""); Htmlstring.Replace("\r\n", ""); Htmlstring = HttpContext.Current.Server.HtmlEncode(Htmlstring).Trim(); return Htmlstring; } #endregion2.#region 截取字符长度 /// <summary> /// 截取字符长度 /// </summary> /// <param name="inputString">字符</param> /// <param name="len">长度</param> /// <returns></returns> public static string CutString(string inputString, int len) { ASCIIEncoding ascii = new ASCIIEncoding(); int tempLen = 0; string tempString = ""; byte[] s = ascii.GetBytes(inputString); for (int i = 0; i < s.Length; i++) { if ((int)s[i] == 63) { tempLen += 2; } else { tempLen += 1; } try { tempString += inputString.Substring(i, 1); } catch { break; } if (tempLen > len) break; } //如果截过则加上半个省略号 byte[] mybyte = System.Text.Encoding.Default.GetBytes(inputString); if (mybyte.Length > len) tempString += "…"; return tempString; } #endregion 你好,我不是要提取,是要截取,截取的意思就是html需要保留,例如如果被截取部分由img标签,截取出来仍然要有,如果截取部分由前半个<p>,则要自动补全</p> 有点难度哦。要匹配所有的HTML标签是否正对又不是匹配截取之前的一个。 str html内容star 起始标记end 截止标记ignoreCase 区分大小写key 0-3 截取出来的内容是否包含起始或截止标记public string getStrData(string str, string star, string end,int c2,bool ignoreCase, int key) { CompareInfo Compare = CultureInfo.InvariantCulture.CompareInfo; int a = -1, b = -1; for(int i = 0; i < c2; i++) { if (!ignoreCase) { if(i == 0) a = str.IndexOf(star); else a = str.IndexOf(star, a + star.Length); } else { if (i == 0) a = Compare.IndexOf(str, star, CompareOptions.IgnoreCase); else a = Compare.IndexOf(str, star, a + star.Length, CompareOptions.IgnoreCase); } if (a == -1) return ""; } if (a == -1) return ""; if (!ignoreCase) b = str.IndexOf(end, a + star.Length); else b = Compare.IndexOf(str, end, a + star.Length, CompareOptions.IgnoreCase); string s = ""; if(b == -1) { if(key == 0) { s = str.Substring(a + star.Length, str.Length - a - star.Length); } else if(key == 1) { s = str.Substring(a, str.Length - a); } else if(key ==2) { s = str.Substring(a + star.Length, str.Length - a - star.Length); } else { s = str.Substring(a, str.Length - a); } } else { if (key == 0) { s = str.Substring(a + star.Length, b - a - star.Length); } else if (key == 1) { s = str.Substring(a, b - a); } else if (key == 2) { s = str.Substring(a + star.Length, b - a - star.Length + end.Length); } else { s = str.Substring(a, b - a + end.Length); } } return s; } ispostback 用JQuery添加TABLE的<tr><td></td>......</tr>,其中的td在FF中都列在第一列 如何截取文字 gridview绑定数据库中的数据,当数据空为空时,为什么整个gridview会不显示了呢? datalist 分页问题 在线等:奇怪,为什么不起作用了 急急急急!!!!!! 自定义Web控件开发求大神帮帮 vs2003的ASP.NET工程中已经没有vsdisco文件了吗? 关于两个表数据链接的问题? MVC3 如何实现一个新闻列表如下 fckeditor2.6.3上传图片成功,但没有返回显示(图片不能预览)??
public static string DropHTML(string Htmlstring)
{
//删除脚本
Htmlstring = Regex.Replace(Htmlstring, @"<script[^>]*?>.*?</script>", "", RegexOptions.IgnoreCase);
//删除HTML
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);
Htmlstring.Replace("<", "");
Htmlstring.Replace(">", "");
Htmlstring.Replace("\r\n", "");
Htmlstring = HttpContext.Current.Server.HtmlEncode(Htmlstring).Trim();
return Htmlstring;
}
#endregion2.#region 截取字符长度
/// <summary>
/// 截取字符长度
/// </summary>
/// <param name="inputString">字符</param>
/// <param name="len">长度</param>
/// <returns></returns>
public static string CutString(string inputString, int len)
{
ASCIIEncoding ascii = new ASCIIEncoding();
int tempLen = 0;
string tempString = "";
byte[] s = ascii.GetBytes(inputString);
for (int i = 0; i < s.Length; i++)
{
if ((int)s[i] == 63)
{
tempLen += 2;
}
else
{
tempLen += 1;
} try
{
tempString += inputString.Substring(i, 1);
}
catch
{
break;
} if (tempLen > len)
break;
}
//如果截过则加上半个省略号
byte[] mybyte = System.Text.Encoding.Default.GetBytes(inputString);
if (mybyte.Length > len)
tempString += "…";
return tempString;
}
#endregion
star 起始标记
end 截止标记
ignoreCase 区分大小写
key 0-3 截取出来的内容是否包含起始或截止标记public string getStrData(string str, string star, string end,int c2,bool ignoreCase, int key)
{
CompareInfo Compare = CultureInfo.InvariantCulture.CompareInfo;
int a = -1, b = -1;
for(int i = 0; i < c2; i++)
{
if (!ignoreCase)
{
if(i == 0)
a = str.IndexOf(star);
else
a = str.IndexOf(star, a + star.Length);
}
else
{
if (i == 0)
a = Compare.IndexOf(str, star, CompareOptions.IgnoreCase);
else
a = Compare.IndexOf(str, star, a + star.Length, CompareOptions.IgnoreCase);
}
if (a == -1) return "";
}
if (a == -1) return "";
if (!ignoreCase)
b = str.IndexOf(end, a + star.Length);
else
b = Compare.IndexOf(str, end, a + star.Length, CompareOptions.IgnoreCase);
string s = "";
if(b == -1)
{
if(key == 0)
{
s = str.Substring(a + star.Length, str.Length - a - star.Length);
}
else if(key == 1)
{
s = str.Substring(a, str.Length - a);
}
else if(key ==2)
{
s = str.Substring(a + star.Length, str.Length - a - star.Length);
}
else
{
s = str.Substring(a, str.Length - a);
}
}
else
{
if (key == 0)
{
s = str.Substring(a + star.Length, b - a - star.Length);
}
else if (key == 1)
{
s = str.Substring(a, b - a);
}
else if (key == 2)
{
s = str.Substring(a + star.Length, b - a - star.Length + end.Length);
}
else
{
s = str.Substring(a, b - a + end.Length);
}
}
return s;
}