Pergunta

O sistema .NET web que estou trabalhando permite que o usuário final para entrada HTML texto formatado em algumas situações. Em alguns desses lugares, queremos deixar todas as tags, mas retirar quaisquer etiquetas de fuga de quebra (mas deixar qualquer quebra no interior do corpo do texto.)

Qual é a melhor maneira de fazer isso? (Não consigo pensar em maneiras de fazer isso, mas eu tenho certeza que eles estão não o melhor.)

Foi útil?

Solução

Como @ Mitch disse:

//  using System.Text.RegularExpressions;

/// <summary>
///  Regular expression built for C# on: Thu, Sep 25, 2008, 02:01:36 PM
///  Using Expresso Version: 2.1.2150, http://www.ultrapico.com
///  
///  A description of the regular expression:
///  
///  Match expression but don't capture it. [\<br\s*/?\>], any number of repetitions
///      \<br\s*/?\>
///          <
///          br
///          Whitespace, any number of repetitions
///          /, zero or one repetitions
///          >
///  End of line or string
///  
///  
/// </summary>
public static Regex regex = new Regex(
    @"(?:\<br\s*/?\>)*$",
    RegexOptions.IgnoreCase
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
    );
regex.Replace(text, string.Empty);

Outras dicas

Pequena alteração para bdukes código, que deve ser mais rápido, pois não retorno.

public static Regex regex = new Regex(
    @"(?:\<br[^>]*\>)*$",
    RegexOptions.IgnoreCase
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
);
regex.Replace(text, string.Empty);

Estou certo de que este não é o melhor caminho também, mas ele deve funcionar a menos que tenha espaços à direita ou algo assim.

while (myHtmlString.EndsWith("<br>"))
{
    myHtmlString = myHtmlString.SubString(0, myHtmlString.Length - 4);
}

Eu estou tentando ignorar a ambigüidade na sua pergunta original, e lê-lo literalmente. Aqui está um método de extensão que sobrecargas TrimEnd para tirar uma string.

static class StringExtensions
{
    public static string TrimEnd(this string s, string remove)
    {
        if (s.EndsWith(remove))
        {
            return s.Substring(0, s.Length - remove.Length);
        }
        return s;
    }
}

Aqui estão alguns testes para mostrar que ele funciona:

        Debug.Assert("abc".TrimEnd("<br>") == "abc");
        Debug.Assert("abc<br>".TrimEnd("<br>") == "abc");
        Debug.Assert("<br>abc".TrimEnd("<br>") == "<br>abc");

Eu quero salientar que esta solução é mais fácil de ler do que regex, provavelmente mais rápido do que regex (você deve usar um profiler, não a especulação, se você está preocupado com o desempenho), e útil para a remoção de outras coisas das extremidades de strings.

regex torna-se mais apropriado se o seu problema é mais geral do que você disse (por exemplo, se você deseja remover <BR> e </BR> e lidar com espaços à direita ou o que quer.

Você pode usar um regex para encontrar e remover o texto com o conjunto match regex a âncora no final da cadeia.

Você também pode tentar (se a marcação é provável que seja uma árvore válido) algo semelhante a:

string s = "<markup><div>Text</div><br /><br /></markup>";

XmlDocument doc = new XmlDocument();
doc.LoadXml(s);

Console.WriteLine(doc.InnerXml);

XmlElement markup = doc["markup"];
int childCount = markup.ChildNodes.Count;
for (int i = childCount -1; i >= 0; i--)
{
    if (markup.ChildNodes[i].Name.ToLower() == "br")
    {
        markup.RemoveChild(markup.ChildNodes[i]);
    }
    else
    {
        break;
    }
}
Console.WriteLine("---");
Console.WriteLine(markup.InnerXml); 
Console.ReadKey();

O código acima é um pouco "scratch-pad", mas se você cortar e colar em um aplicativo de console e executá-lo, ela não funciona: =)

Você pode usar RegEx ou verificar se a cadeia de fuga é uma pausa e removê-lo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top