数据库中字符串只能截取(包括html)

这里给大家介绍三种方法,首先先说明一下这三种方法的产生前景。今天是十一长假前一天,明天公司就开始放假,今天心情好,一下写两篇博客

  公司新项目里面用到了一个作业展示的页面,我在读取作业标题时发现标题太长,所以我就对标题进行截取,但是发现里面的字段是带html标签的,所以我就想办法,想把html标签截取出来,但是发现截取出来后有两个问题:

1,html标签的完整,比如说<span>就是说必须这个标签必须是到>才结束

2,html标签的闭合,比如说<span>必须要有</span>才能完整结束。

我在网上找了一些方法,发现要不就是使用正则(正则是把所有html标签给匹配掉,但是没办法给添加回去,这就是说html标签不能使用,这点不符合我的业务需求),要不就是按字节截取,但是没有判断结束标签和闭合标签,就是我上

面说的两个问题。所以我写了一个比较全的方法,并举例说明:

 原文地址:http://www.cnblogs.com/sixiangqimeng/p/3344272.html  

 

  string str="<p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"font-family:宋体;\">1</span><span style=\"font-family:宋体;\">【题文】设集设集(</span></p><p class=\"MsoNormal\"><span lang=\"EN-US\" style=\"font-family:宋体;\">A</span><span style=\"font-family:宋体;\">.<span lang=\"EN-US\">1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B</span>.<span lang=\"EN-US\">3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C</span>.<span lang=\"EN-US\">4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;D</span>.<span lang=\"EN-US\">8</span></span></p>";
           


          string[] ss = { "p", "span" };
          string sss=  SafeTrim(str,145,false,'<','>',ss);
         //这样的最后结果就是:<p class="MsoNormal"><span lang="EN-US" style="font-family:宋体;">1</span><span style="font-family:宋体;">【题文】设集设集(</span></p><p class="MsoNormal"><span lang="EN-US" style="font-family:宋体;"></span></p>




 /// <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;
        }    


完美运行。

 

还有两种方法是直接在底层操作,这样的目的就是直接对datable或者dataset进行操作。

代码如下:原文地址:http://www.cnblogs.com/sixiangqimeng/p/3344272.html  

 /// <summary>   
        /// 按字节长度截取DataSet对象中的字符串(支持截取带HTML标记的字符串)   
        /// </summary>   
        /// <param name="ds">DataSet对象</param>   
        /// <param name="TableName">字符串所在的数据表的名称</param>   
        /// <param name="column">字符串所在的数据列的名称</param>   
        /// <param name="length">截取的字节长度</param>   
        /// <param name="StripHTML">截取的结果是否为html代码。如果为true,则去掉Html标记;否则保留html标记。</param>   
        /// <return>因为需要更改的DataSet对象已经通过参数传递过来了,所以不需要返回值。</return>   
        public static void GetContentSummary(DataSet ds, string TableName, string column, int length, bool StripHTML)  
        {  
            string content = "";  
            DataTable dt = ds.Tables[TableName];  
            int ColumnCount = dt.Rows.Count;  
  
            for (int i = 0; i < ColumnCount; i++)  
            {  
                content = dt.Rows[i][column].ToString();  
                dt.Rows[i][column] = HTML.FormatString.GetContentSummary(content, length, true);  
            }  
        }  
  
        /// <summary>   
        /// 按字节长度截取DataTable对象中的字符串(支持截取带HTML标记的字符串)   
        /// </summary>   
        /// <param name="dt">DataTable对象</param>   
        /// <param name="column">字符串所在的列的名称</param>   
        /// <param name="length">截取的字节长度</param>   
        /// <param name="StripHTML">截取的结果是否为html代码。如果为true,则去掉Html标记;否则保留html标记。</param>   
        /// <return>因为需要更改的DataTable对象已经通过参数传递过来了,所以不需要返回值。</return>   
        public static void GetContentSummary(DataTable dt, string column, int length, bool StripHTML)  
        {  
            string content = "";  
            int ColumnCount = dt.Rows.Count;  
  
            for (int i = 0; i < ColumnCount; i++)  
            {  
                content = dt.Rows[i][column].ToString();  
                dt.Rows[i][column] = HTML.FormatString.GetContentSummary(content, length, true);  
            }  
        }  
View Code

 原文地址:http://www.cnblogs.com/sixiangqimeng/p/3344272.html  

 

posted @ 2013-09-28 15:37  思想启蒙家  阅读(538)  评论(0编辑  收藏  举报