在Episerver中截断Xhtmlstring

时间:2015-12-08 08:41:04

标签: c# html string episerver

我需要得到一个截断的Xhtmlstring的html友好版本,因为标签结尾可能会在截断时被剪裁。关于如何实现这一点的任何想法?我想过先删除所有标签然后剪切,但是这个内部episerver是否有解决方案,或者这只是使用正则表达式的基本字符串操作?

2 个答案:

答案 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