2010-02-11 8 views
3

J'ai besoin d'encoder un texte entier tout en laissant le < et> intact.encoder html dans Asp.net C# mais laisser les balises intactes

exemple

<p>Give me 100.000 €!</p> 

doit devenir:

<p>Give me 100.000 &euro;!</p> 

les balises HTML doivent rester intacts

+0

Avez-vous absolument besoin de coder ces valeurs ou pouvez-vous simplement tout sortir en tant qu'unicode? Si vous avez vraiment besoin d'encoder le texte, je dirais probablement que vous allez devoir passer par le Html Agility Pack. Mais rappelez-vous que € est un caractère Unicode valide si vous définissez correctement le type MIME. –

Répondre

1

Peut-être utiliser String.replace pour seulement ces caractères que vous souhaitez encoder?

+0

Cela doit être la meilleure approche. Il semble que l'OP essaie de coder des entités non-ASCII (probablement pour contourner les problèmes de jeu de caractères). Pour cela, une expression rationnelle correspondant à 127 et le remplacement par des noms d'entité connus seraient les meilleurs. Ou mieux encore, triant le problème charset si c'est le problème sous-jacent. :-) –

+1

ou l'inverse. +1: <en> retour à < and > – MichaelD

2

vous pourriez aller pour Html Agility Pack puis coder les valeurs des balises

+0

+1 - Je pense que cela résout la plupart des problèmes avec le remplacement ou la regex, et c'est probablement moins de travail que de créer votre propre liste blanche d'étiquettes à ignorer ou de caractères à remplacer. – RedFilter

0

Vous pouvez utiliser HtmlTextWriter en plus HTMLEncode. Donc, vous utiliseriez HtmlTextWriter pour configurer votre <p></p> puis définissez simplement le corps du <p></p> en utilisant HtmlEncode. HtmlTextWriter autorise ToString(); et un tas d'autres méthodes, donc il ne devrait pas y avoir beaucoup plus de code.

1

Utilisez une expression régulière qui correspond soit à une étiquette ou ce qui est entre les balises et encode ce qui est entre:

html = Regex.Replace(
    html, 
    "(<[^>]+>|[^<]+)", 
    m => m.Value.StartsWith("<") ? m.Value : HttpUtility.HtmlEncode(m.Value) 
); 
0

Comme d'autres l'ont suggéré, cela peut être réalisé avec HtmlAgilityPack.

public static class HtmlTextEncoder 
{ 
    public static string HtmlEncode(string html) 
    { 
     if (html == null) return null; 

     var doc = new HtmlDocument(); 
     doc.LoadHtml(html); 

     EncodeNode(doc.DocumentNode); 

     doc.OptionWriteEmptyNodes = true; 
     using (var s = new MemoryStream()) 
     { 
      doc.Save(s); 
      var encoded = doc.Encoding.GetString(s.ToArray()); 
      return encoded; 
     } 
    } 

    private static void EncodeNode(HtmlNode node) 
    { 
     if (node.HasChildNodes) 
     { 
      foreach (var childNode in node.ChildNodes) 
      { 
       if (childNode.NodeType == HtmlNodeType.Text) 
       { 
        childNode.InnerHtml = HttpUtility.HtmlEncode(childNode.InnerHtml); 
       } 
       else 
       { 
        EncodeNode(childNode); 
       } 
      } 
     } 
     else if (node.NodeType == HtmlNodeType.Text) 
     { 
      node.InnerHtml = HttpUtility.HtmlEncode(node.InnerHtml); 
     } 
    } 
} 

Ce parcourt tous les noeuds dans le code HTML, et remplace tous les nœuds de texte avec le texte codé en HTML. Je ai créé un .NET fiddle to demonstrate this technique.