程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 安全的截取指定長度的html或者ubb字符串

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

編輯:關於ASP.NET

在將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 }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved