2015-12-08 3 views
1

Мне нужно получить html-дружественную версию усеченной Xhtmlstring, поскольку окончание тегов может быть обрезано при усечении. Любые идеи о том, как достичь этого? Я подумал о том, чтобы сначала избавиться от всех тегов, а затем обрезать, но есть ли решение для этого внутри episerver или это просто базовые манипуляции с регулярными выражениями?Truncating Xhtmlstring в Episerver

+0

Нашли это как общее решение для этого случая: http://robvolk.com/truncate-html-string-c-extension-method/ – mec

+0

Действительно ли строка XHTML действительна до того, как вы попытаетесь ее усечь? –

+0

Просто быстрое напоминание: http://stackoverflow.com/a/1732454/2319351 –

ответ

3

Существует встроенную вспомогательную функцию в TextIndexer класса под названием StripHtml, который может быть использован для удаления любых тегов, чтобы в конечном итоге с открытым текстом, прежде чем усечения:

var plainText = TextIndexer.StripHtml(someHtml); 

Обратите внимание, что этот метод также могут быть использованы для срезанным строку следующим образом:

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

Вы также будете иметь возможность иметь ул такие как «...», добавленные к строке, если она была усечена.

+0

Спасибо! Я действительно много читаю ваш блог. – mec

+0

Отлично! Не стесняйтесь отмечать как ответ, если это вам помогло. :) –

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.