安全的截取指定长度的html或者ubb字符串

在将html代码输出到页面时,有时候会需要截断字符串保留指定长度的字符串,由于html中有些标签 必须成对出现,所以在截取html时需要特别注意,不能因为截断问题把页面搞乱掉。

在截取字符串时需要记录每一个标签是否关闭,如果截取到指定长度还有没有关闭的标签,那么我们 需要将标签关闭,或者删除掉未关闭的标签。不考虑某些不需要关闭标签的情况,html开始和结束标签总 是成对出现的,我们可以遍历输入的字符串,并在标签开始时放入堆栈中,遇到结束标签时从堆栈中弹出 一个元素,这样遍历到指定长度,堆栈中留下的标签就是需要补全或者删除掉的标签。

下面是代码实现,如果大家有更好的方法请给出来:

001 static char END_SLASH = '/';
002
003 /// <summary>
004  /// 安全的截断字符串
005 /// </summary>
006 /// <param  name="input">输入串</param>
007 /// <param name="length">截断长度 </param>
008 /// <param name="trimHalfTag">true:截断半截标签;false:补全 半截标签</param>
009 /// <param name="tagStartChar">标签开始字符 </param>
010 /// <param name="tagEndChar">标签结束字符 </param>
011 /// <param name="mustCloseTags">需要关闭的标签数组 </param>
012 /// <returns>length长度的字符串</returns>
013 public  static string SafeTrim(string input, int length, bool trimHalfTag, char  tagStartChar, char tagEndChar, string[] mustCloseTags)
014 {
015     if  (length <= 0) throw new ArgumentException("length 必须是正数");
016     if  (mustCloseTags == null) throw new ArgumentNullException ("mustCloseTags");
017
018     int inputLen = input.Length;
019     if  (string.IsNullOrEmpty(input) || inputLen <= length) return input;
020
021      string result = string.Empty;
022
023     //声明堆栈用来放标签
024      Stack<string> tags = new Stack<string>();
025
026      for (int i = 0; i < length; i++)
027     {
028         char  c = input[i];
029
030         if (c == tagStartChar)
031          {
032             string tag = string.Empty;
033              int tagIndex = i + 1;
034             bool isTagEnd =  false;
035             bool isTagNameEnd = false;
036              result += c;
037             bool hasMarkTagInStack =  false;
038             while (tagIndex < inputLen)
039              {
040                 char tagC = input [tagIndex];
041                 result += tagC;
042                  tagIndex++;
043                 if (tag ==  string.Empty && tagC == END_SLASH)
044                  {
045                     isTagEnd = true;
046                      continue;
047                 }
048                  if (!isTagNameEnd)
049                  {
050                     if (char.IsLetter(tagC) ||  char.IsNumber(tagC))
051                     {
052                          tag += tagC;
053                      }
054                     else
055                      {
056                         isTagNameEnd  = true;
057                     }
058                  }
059
060                 if (!string.IsNullOrEmpty(tag))
061                 {
062                      if (isTagNameEnd && !hasMarkTagInStack)
063                      {
064                         if (isTagEnd)
065                          {
066                              tags.Pop();
067                         }
068                         else
069                          {
070                              tags.Push(tag);
071                         }
072                          hasMarkTagInStack = true;
073                      }
074                 }
075
076                  if (isTagNameEnd)
077                 {
078                      if (tagC == tagEndChar)
079                      {
080                         i =  tagIndex - 1;
081                         break;
082                      }
083                 }
084
085             }
086         }
087          else
088         {
089             result += c;
090          }
091     }
092
093     while (tags.Count > 0)
094      {
095         string tag = tags.Pop();
096
097          bool isMustCloseTag = false;
098         foreach (string mustCloseTag in  mustCloseTags)
099         {
100             if  (string.Compare(mustCloseTag, tag, true) == 0)
101             {
102                  isMustCloseTag = true;
103                  break;
104             }
105         }
106          if (isMustCloseTag)
107         {
108             if  (trimHalfTag)
109             {
110                 int  lastTagIndex = result.LastIndexOf(tagStartChar.ToString() + tag,  StringComparison.CurrentCultureIgnoreCase);
111
112                  result = result.Substring(0, lastTagIndex);
113             }
114              else
115             {
116                  result += (tagStartChar.ToString() + END_SLASH + tag + tagEndChar);
117              }
118         }
119     }
120
121      return result;
122 }

时间: 2024-10-03 09:35:34

安全的截取指定长度的html或者ubb字符串的相关文章

asp.net 安全的截取指定长度的html或者ubb字符串_实用技巧

在截取字符串时需要记录每一个标签是否关闭,如果截取到指定长度还有没有关闭的标签,那么我们需要将标签关闭,或者删除掉未关闭的标签.不考虑某些不需要关闭标签的情况,html开始和结束标签总是成对出现的,我们可以遍历输入的字符串,并在标签开始时放入堆栈中,遇到结束标签时从堆栈中弹出一个元素,这样遍历到指定长度,堆栈中留下的标签就是需要补全或者删除掉的标签. 下面是代码实现,如果大家有更好的方法请给出来: 复制代码 代码如下: static char END_SLASH = '/'; /// <summ

解决方案-截取指定长度的富文本内容可能会出现页面被凌乱的问题

问题描述 截取指定长度的富文本内容可能会出现页面被凌乱的问题 5C freemaker页面中截取指定长度的字符串,超出长度的部分用-替代 <#if topic.title?length lt 35> ${topic.title}<#else> ${topic.title?substring(035)}... </#if> 如果数据库中topic.title的内容不是纯文本,而是富文本(含有很多html标签的文本)内容,按指定 长度截取的话,就有可能会破坏富文本的html

jQuery截取指定长度字符串的实现原理及代码_jquery

截取指定长度字符串操作在网站建设中大量使用,尤其是在新闻列表这种类型的操作中大量应用. 下面就是一个截取字符串代码实例: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="author" content="htt

jQuery截取指定长度字符串代码_jquery

例子,截取字符串代码. <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>jQuery截取字符串操作---www.jb51.net</title> <script type="text/javascript"

JavaScript截取指定长度字符串点击可以展开全部代码_javascript技巧

文章的篇幅往往不是那么恰到好处,如果以原有的篇幅展示,那么有可能会影响网页的布局或者美观度,这个时候就要根据情况适量截取一定的字符串,以适应布局,不过当点击一个按钮的时候依然可以展开全部的内容,下面就通过一个实例详细介绍一下如何实现此效果,代码示例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" conten

截取指定长度的文字(包含对汉字的处理)

一般来说,要截取的变量来自Mysql,首先要保证那个字段长度要足够长,一般为char(200),可以保持100个汉字,包括标点. 本程序实现的功能:截取指定长度汉字而不会出现以"?>"结尾,超出部分以"..."代替 <?PHP $str="这个字符比较长SO LONG"; $Short_Str=showShort($str,4);//截取前面4个汉字,结果为:这个字符... Echo "$Short_Str"; F

用C#截取指定长度的中英文混合字符串

字符串 我们常做的一件事情,就是在文章系统中,截取一定长度的文章标题,超过指定长度,就加"..." 如两个字符串:string str1 = "中国人要啊abc呀~";string str2 = "1中国人23456abc呀~"; 要截取后,输出: str1 = "中国人要...";str2 = "1中国人2..."; 即要把中英文混合的字符串,在截取后,长度要一致,即8个字节的长度(不包括三个点),而且不

前后台实现精确截取指定长度字符串(考虑全角半角)

页面上很多显示新闻列表时,考虑面子问题,常常需要限制标题长度. 以前都是用 <%#Eval("title").ToString().Length > 10 ? Eval("title").ToString ().Substring(0, 8) + "..." : Eval("title").ToString()%> 这样的方式实现,这样代码即繁多又不能重用,不过这个还不是问题,因为可以在后台写个传字符串 和指

截取指定长度文字,超出部分以特定字符代替

这是在做新闻发布系统时收录的一个简单算法.感觉挺好用的.效果如下(新闻标题):   下面是算法源码: #region 将指定字符串按指定长度进行剪切 /// <summary> /// 将指定字符串按指定长度进行剪切 /// </summary> /// <param name= "oldStr "> 需要截断的字符串 </param> /// <param name= "maxLength "> 字符串的