在 Episerver 中截断 Xhtmlstring

Truncating Xhtmlstring in Episerver

我需要获得截断 Xhtml 字符串的 html 友好版本,因为标记结尾在截断时可能会被截断。关于如何实现这一目标的任何想法?我想过先去掉所有标签然后剪裁,但是在 episerver 内部有解决这个问题的方法还是这只是使用正则表达式的基本字符串操作?

对于有效的 XHTML,您可以使用 XElement class 来简化事情,即您不关心偶尔的正则表达式狂潮。当只有一个文本节点存在时,以下示例应该适用于简单的情况:

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

TextIndexer class 中有一个名为 StripHtml 的内置辅助函数,可用于删除任何截断前以纯文本结尾的标签:

var plainText = TextIndexer.StripHtml(someHtml);

请注意,此方法也可用于截断 字符串,如下所示:

// Truncate to 150 characters
var truncatedString = TextIndexer.StripHtml(someHtml, 150);

如果字符串被截断,您还可以将诸如“...”的字符串附加到该字符串。