我需要得到一个截断的Xhtmlstring的html友好版本,因为标签结尾可能会在截断时被剪裁。关于如何实现这一点的任何想法?我想过先删除所有标签然后剪切,但是这个内部episerver是否有解决方案,或者这只是使用正则表达式的基本字符串操作?
答案 0 :(得分:4)
TextIndexer 类中有一个名为 StripHtml 的内置辅助函数,可用于删除任何标记,以便在截断前以纯文本结尾:
var plainText = TextIndexer.StripHtml(someHtml);
请注意,此方法也可用于截断字符串,如下所示:
// Truncate to 150 characters
var truncatedString = TextIndexer.StripHtml(someHtml, 150);
你也可以拥有一个字符串,例如" ..."如果被截断,则附加到字符串。
答案 1 :(得分:1)
对于有效的XHTML,您可以使用XElement
类来简化操作,即您不关心偶尔的正则表达式狂热。当只有一个文本节点存在时,以下示例应该适用于简单的情况:
public class Truncator {
private const String Ellipsis = "…";
private const String EllipsisHtmlEntity = "…";
public static String Truncate(XElement xElement, Int32 length, Boolean useHtmlEntity = false) {
if (ReferenceEquals(xElement, null))
throw new ArgumentException(nameof(xElement));
var textNode =
(XText)
xElement.DescendantNodes()
.FirstOrDefault(node => !ReferenceEquals(node, null) && node.NodeType == XmlNodeType.Text);
if (!ReferenceEquals(textNode, null))
textNode.Value = Truncate(textNode.Value, length);
var truncatedResult = xElement.ToString(SaveOptions.DisableFormatting);
return useHtmlEntity ? truncatedResult.Replace(Ellipsis, EllipsisHtmlEntity) : truncatedResult;
}
public static String Truncate(String str, Int32 length, Boolean useHtmlEntity = false) {
if (String.IsNullOrWhiteSpace(str))
return str;
var truncated = str.Trim().Substring(0, length - 1).Trim();
return String.IsNullOrWhiteSpace(str) || str.Length < length
? str
: $"{truncated}{(useHtmlEntity ? EllipsisHtmlEntity : Ellipsis)}";
}
}
如果您开始使用String
,只需XElement.Parse(it)
即可获得XElement
。