这里给大家介绍三种方法,首先先说明一下这三种方法的产生前景。今天是十一长假前一天,明天公司就开始放假,今天心情好,一下写两篇博客
公司新项目里面用到了一个作业展示的页面,我在读取作业标题时发现标题太长,所以我就对标题进行截取,但是发现里面的字段是带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 B</span>.<span lang="EN-US">3 C</span>.<span lang="EN-US">4 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); } }