asp.net(文章截取前几行作为列表摘要)无损返回HTML代码
更新时间:2012年12月04日 16:56:54 作者:
asp.net(文章截取前几行作为列表摘要)无损返回HTML代码,需要的朋友可以参考下
复制代码 代码如下:
<BR> /* <STRONG>时间很久远了,有码友要,我抄了下来,记得使用的时候还是有部分例外情况要处理,大部分是ok的。</STRONG>
* 函数:
* 说明:无损返回HTML代码
*
* 作者:卡斯Kas(QQ:10590916)
* 修改:2010-12-13、
*/
public static string LeftH(string str, int l)
{
//为了防止错误
string odstr = str;
bool isHtml = false;//判断截取开头是否是字符串
int maxLen = str.Length;
int n = 0, i = 0, b = 0, e = 0;
string c, c2 = "", Start = "", EndLabel = "", AllLabel = "";
if (l >= str.Length) return str;//截取字段大于字符长度
bool isErr = false;
try
{
while (n < l && i < maxLen)
{
//1
i++;
c = str.Substring(i - 1, 1);
string end2str = "";
try
{
end2str = str.Substring(i - 1, 2);
}
catch
{
end2str = "";
}
if (c == "<" && end2str != "</")
{
isHtml = true;
b = i;//记录一个位置
//5 解决非成对标签
string end2tag = "";
try
{
end2tag = str.Substring(i, 2);
}
catch
{
end2tag = "";
}
if (end2tag == "br")
{
isHtml = false;
}
if (str.Substring(i, 1).ToLower() == "%")
{
isHtml = false;
}
if (str.Substring(i, 1).ToLower() == "?")
{
isHtml = false;
}
else if (end2tag == "hr")
{
isHtml = false;
}
//5end
}
//1end
//2
if (c == "<" && end2str == "</")
{
c2 = str.Substring(i - 1, str.Substring(i - 1).IndexOf(">") + 1);
AllLabel = AllLabel.Substring(c2.Length);
}
//2end
Start = Start + c;//记录当前字符及其前面字符
if (!isHtml)
{
//6 较为准确的计数
try
{
if (str.Substring(i, 2).ToLower() == "br")
{
}
else if (str.Substring(i, 2).ToLower() == "hr")
{
}
else
{
n++;
}
}
catch
{
//如果出错,则返回纯文本(@"<[^>]+>|</[^>]+>");
//odstr = Regex.Replace(odstr, @"<[^>]+>|</[^>]+>", "", RegexOptions.IgnoreCase);
odstr = odstr.Replace("<", "<").Replace(">", ">");
if (l > odstr.Length) l = odstr.Length;
return odstr.Substring(0, l);
}
//6end
}
else
{
if (c == ">")//如果循环到>时,要处理的成对标签中间部分
{
if (isHtml)
{
EndLabel = str.Substring(b, i - b);//获取<到>之间的代码
e = EndLabel.IndexOf(" ");//标签属性都有空格,以空格为分割,获取标签名
if (e > 0)
{
EndLabel = "</" + EndLabel.Substring(0, e) + ">";
}
else
{
EndLabel = "</" + EndLabel;
}
AllLabel = EndLabel + AllLabel;//记录当前结束标签,及所有有关结束标签
}
isHtml = false;//重置属性,从新开始
}
}
//4 当结束时,发现有未闭合的标签,则重新来一次
if (n + 1 >= l)
{
if (InStrN(Start, "<") != InStrN(Start, ">"))
{
n--;
}
}
//4end
}//end while
}
catch
{
isErr = true;
}
string newReString = Start + AllLabel + "...";
//最后再次验证
Regex Rg = new Regex("<.[^>/]+>", RegexOptions.Compiled);
Regex Rg2 = new Regex(@"<\s*/[a-z]\s*>", RegexOptions.Compiled);
if (inStrLen(newReString, "<") != inStrLen(newReString, ">"))
{
isErr = true;
}
else if (inStrLen(newReString.Replace(""", "\""), "\"") % 2 == 1)
{
isErr = true;
}
else if (Rg.Matches(newReString).Count != Rg2.Matches(newReString).Count)
{
isErr = true;
}
if (isErr)
{
odstr = odstr.Replace("<", "<").Replace(">", ">").Replace("\"", """).Replace("'", "'");
if (l > odstr.Length)
{ newReString = odstr; }
else
{
try
{
newReString = odstr.Substring(0, l) + "...";
}
catch
{
newReString = odstr;
}
}
}
return newReString;//返回
}
您可能感兴趣的文章:
- 适用与firefox ASP.NET无刷新二级联动下拉列表
- asp.net Ext grid 显示列表
- asp.net 自制的单选、多选列表实现代码
- asp.net 下拉列表无级数据绑定实现代码
- asp.net 新闻列表样式代码
- ASP.NET对无序列表批量操作的三种方法小结
- ASP.NET系统关键字及保留字列表整理
- asp.net TreeView与XML三步生成列表树
- ASP.NET批量操作基于原生html标签的无序列表的三种方法
- asp.net新闻列表生成静态页之批量和单页生成
- ASP.NET MVC5网站开发概述(一)
- ASP.NET MVC5网站开发项目框架(二)
- ASP.NET MVC5 网站开发框架模型、数据存储、业务逻辑(三)
- ASP.NET MVC5网站开发用户注册(四)
- ASP.NET MVC5网站开发用户登录、注销(五)
- ASP.NET MVC5网站开发用户修改资料和密码(六)
- ASP.NET MVC5网站开发文章管理架构(七)
- ASP.NET MVC5网站开发添加文章(八)
- ASP.NET MVC5网站开发显示文章列表(九)
相关文章
Path类与Directory类与File类对路径/目录/文件的操作实例
本文将详细介绍下:Path对路径字符串进行操作/Directory和DirectoryInfo 对目录进行操作/File和FileInfo对文件进行操作,感兴趣的你可不要错过了哈2013-02-02浅谈ASP.NET Core 2.0 带初始参数的中间件(译)
这篇文章主要介绍了浅谈ASP.NET Core 2.0 带初始参数的中间件(译),非常具有实用价值,需要的朋友可以参考下2017-10-10
最新评论