public static string HtmlCutString(string str, int length, string character = "…") { str = System.Web.HttpUtility.HtmlDecode(str.Replace(" ", "")); int len = 0, tagIndex = 0, strlength = str.Length; Regex objRegExp = new Regex("(<.+?>)", RegexOptions.IgnoreCase); MatchCollection matches = objRegExp.Matches(str); for (int i = 0; i < strlength; i++) { if (matches.Count > tagIndex && i == matches[tagIndex].Index) { i += matches[tagIndex].Result("$1").Length - 1; tagIndex++; } else { if (System.Text.Encoding.Default.GetBytes(str.Substring(i, 1)).Length > 1) len += 2; else len += 1; } if (len >= length) { string other = ""; while (matches.Count > tagIndex) { other += matches[tagIndex].Value; tagIndex++; } int otherlength = other.Length; objRegExp = new Regex(@"<s*(.+?)[^>]*?><s*/s*1s*>|<s*(.+?).*?/s*>", RegexOptions.IgnoreCase); while (objRegExp.Matches(other).Count > 0) { other = objRegExp.Replace(other, ""); } other = new Regex(@"<s*[^/]+?>", RegexOptions.IgnoreCase).Replace(other, ""); if (i + otherlength + 1 < strlength) str = str.Substring(0, i + 1 - character.Length) + character + other; else str = str.Substring(0, i + 1) + other; break; } } return str; }