2010-05-28 5 views
2

Très bien, une tâche facile pour vous. Nous utilisons RichTextBox d'ActiveReport pour afficher des bits aléatoires de code HTML.Remplacement de balises HTML spécifiques à l'aide de Regex

Les balises HTML prises en charge par ActiveReport peuvent être trouvés ici: http://www.datadynamics.com/Help/ARNET3/ar3conSupportedHtmlTagsInRichText.html

Un exemple de ce que je veux faire est de remplacer un match de <div style="text-align:*</div> par <p style=\"text-align:*</p> afin d'utiliser une balise pris en charge pour le texte d'alignement.

J'ai trouvé l'expression regex suivante pour trouver dans mon entrée html le match correct:

<div style=\"text-align:(.*?)</div> 

Cependant, je ne peux pas trouver un moyen de garder le texte précédent contenu dans les balises après mon remplacement. Une idée? Est-ce moi ou Regex sont généralement un PITA? :)

private static readonly IDictionary<string, string> _replaceMap = 
     new Dictionary<string, string> 
      { 
       {"<div style=\"text-align:(.*?)</div>", "<p style=\"text-align:(.*?)</p>"} 
      }; 

    public static string FormatHtml(string html) 
    { 
     foreach(var pair in _replaceMap) 
     { 
      html = Regex.Replace(html, pair.Key, pair.Value); 
     } 

     return html; 
    } 

Merci!

+5

RegEx et HTML ne sont généralement pas bien ensemble http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+1

@Nick Gotch Merci. Je suis content que quelqu'un d'autre se batte le bon combat. –

Répondre

4

Utilisation $1:

{"<div style=\"text-align:(.*?)</div>", "<p style=\"text-align:$1</p>"} 

Notez que vous pouvez simplifier à:

{"<div (style=\"text-align:(?:.*?))</div>", "<p $1</p>"} 

En outre, il est généralement une meilleure idée d'utiliser un analyseur HTML comme HtmlAgilityPack que d'essayer d'analyser HTML à l'aide régulière expressions. Voici comment vous pouvez le faire:

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(html); 
foreach (var e in doc.DocumentNode.Descendants("div")) 
    e.Name = "p"; 
doc.Save(Console.Out); 

Résultat:

 
<p style="text-align:center">foo</p><p style="text-align:center">bar</p> 
3

Au lieu d'utiliser regex'es vous devez utiliser un outil qui est plus adapté pour analyser et modifier html. Je recommanderais le Html Agility Pack pour cela - il a été écrit pour faire exactement ce dont vous avez besoin.

+0

Merci pour la suggestion, mais je suis à la recherche d'un moyen rapide et facile de résoudre ce problème sans bibliothèques externes. Je vais m'assurer de jeter un coup d'œil sur le pack Html Agility, cela pourrait être utile sur d'autres projets! –

+0

matthewpw: Je pense que vous manquez son point. HtmlAgilityPack * est * un moyen rapide et facile de résoudre votre tâche - regex n'est pas conçu pour analyser le HTML et c'est pourquoi vous trouvez cela difficile. –

+1

Consultez cette réponse à une question similaire. C'est un classique de StackOverflow: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

Questions connexes