zoukankan      html  css  js  c++  java
  • 数据库中字符串只能截取(包括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  

  • 相关阅读:
    iOS开发拓展篇—音频处理(音乐播放器5)
    iOS开发拓展篇—音频处理(音乐播放器4)
    iOS开发拓展篇—音频处理(音乐播放器3)
    iOS开发拓展篇—音频处理(音乐播放器2)
    iOS开发拓展篇—音频处理(音乐播放器1)
    iOS开发拓展篇—CoreLocation地理编码
    iOS开发拓展篇—CoreLocation定位服务
    单片机CRC源码
    VC6.0中的灰色字体是什么?
    C语言:自定义变量范围
  • 原文地址:https://www.cnblogs.com/sixiangqimeng/p/3344272.html
Copyright © 2011-2022 走看看