当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > asp.net 安全的截取指定长度的html或者ubb字符串

ASP.NET
不同映射模式下的直线输出的效果问题
ASP.NET开发下的MVC设计模式的实现
ASP.NET编写应用程序的十大技巧
ASP.NET中使用AJAX的简单方法
ASP.NET MVC实现自己的视图引擎
认识asp.net会话状态
ASP.NET实现页面传值的几种方法
.NET中容易混淆的几组重要概念
详解.NET中的动态编译技术
如何使用ASP.Net加密Cookie
ASP.NET 2.0跨网页提交的三种方法
ASP.NET 2.0创建母版页引来的麻烦
.Net整合其他平台的一些探讨
ASP.NET编程经验技巧10则
最佳实践 ADO.NET实用经验无保留曝光
在.NET上执行多线程操作要考虑的两大因素
.Net开发 细说Visual Basic.Net
ASP.NET网络编程中经常用到的27个函数集
ASP.NET防止用户多次登录的方法
对ASP.NET MVC项目中的视图做单元测试

ASP.NET 中的 asp.net 安全的截取指定长度的html或者ubb字符串


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 245 ::
收藏到网摘: n/a

在将html代码输出到页面时,有时候会需要截断字符串保留指定长度的字符串,由于html中有些标签必须成对出现,所以在截取html时需要特别注意,不能因为截断问题把页面搞乱掉。 在截取字符串时需要记录每一个标签是否关闭,如果截取到指定长度还有没有关闭的标签,那么我们需要将标签关闭,或者删除掉未关闭的标签。不考虑某些不需要关闭标签的情况,html开始和结束标签总是成对出现的,我们可以遍历输入的字符串,并在标签开始时放入堆栈中,遇到结束标签时从堆栈中弹出一个元素,这样遍历到指定长度,堆栈中留下的标签就是需要补全或者删除掉的标签。
下面是代码实现,如果大家有更好的方法请给出来:
复制代码 代码如下:

static char END_SLASH = '/';
/// <summary>
/// 安全的截断字符串
/// </summary>
/// <param name="input">输入串</param>
/// <param name="length">截断长度</param>
/// <param name="trimHalfTag">true:截断半截标签;false:补全半截标签</param>
/// <param name="tagStartChar">标签开始字符</param>
/// <param name="tagEndChar">标签结束字符</param>
/// <param name="mustCloseTags">需要关闭的标签数组</param>
/// <returns>length长度的字符串</returns>
public static string SafeTrim(string input, int length, bool trimHalfTag, char tagStartChar, char tagEndChar, string[] mustCloseTags)
{
if (length <= 0) throw new ArgumentException("length 必须是正数");
if (mustCloseTags == null) throw new ArgumentNullException("mustCloseTags");
int inputLen = input.Length;
if (string.IsNullOrEmpty(input) || inputLen <= length) return input;
string result = string.Empty;
//声明堆栈用来放标签
Stack<string> tags = new Stack<string>();
for (int i = 0; i < length; i++)
{
char c = input[i];
if (c == tagStartChar)
{
string tag = string.Empty;
int tagIndex = i + 1;
bool isTagEnd = false;
bool isTagNameEnd = false;
result += c;
bool hasMarkTagInStack = false;
while (tagIndex < inputLen)
{
char tagC = input[tagIndex];
result += tagC;
tagIndex++;
if (tag == string.Empty && tagC == END_SLASH)
{
isTagEnd = true;
continue;
}
if (!isTagNameEnd)
{
if (char.IsLetter(tagC) || char.IsNumber(tagC))
{
tag += tagC;
}
else
{
isTagNameEnd = true;
}
}
if (!string.IsNullOrEmpty(tag))
{
if (isTagNameEnd && !hasMarkTagInStack)
{
if (isTagEnd)
{
tags.Pop();
}
else
{
tags.Push(tag);
}
hasMarkTagInStack = true;
}
}
if (isTagNameEnd)
{
if (tagC == tagEndChar)
{
i = tagIndex - 1;
break;
}
}
}
}
else
{
result += c;
}
}
while (tags.Count > 0)
{
string tag = tags.Pop();
bool isMustCloseTag = false;
foreach (string mustCloseTag in mustCloseTags)
{
if (string.Compare(mustCloseTag, tag, true) == 0)
{
isMustCloseTag = true;
break;
}
}
if (isMustCloseTag)
{
if (trimHalfTag)
{
int lastTagIndex = result.LastIndexOf(tagStartChar.ToString() + tag, StringComparison.CurrentCultureIgnoreCase);
result = result.Substring(0, lastTagIndex);
}
else
{
result += (tagStartChar.ToString() + END_SLASH + tag + tagEndChar);
}
}
}
return result;
}

转载请保留链接 玉开的技术博客