2009-05-27 7 views
-1

Mon application collecte du contenu HTML fourni par des utilisateurs internes qui est utilisé pour créer des articles de manière dynamique sur le site Web de l'entreprise.C# Expression régulière pour remplacer la balise html personnalisée

Je veux mettre en œuvre une fonction pour laquelle les utilisateurs peuvent entourer un mot/expression dans le contenu HTML avec une balise spéciale appelée <recherche> .... </recherche > et lorsque le contenu est enregistré dans la base de données, l'application va convertir <recherche> WORD/PHRASE </recherche > pour dire www.google.com/?q=WORD/PHRASE après avoir codé le mot ou l'expression.

Je pense que les expressions régulières peuvent être utilisées pour obtenir cette fonctionnalité, mais besoin de quelques conseils sur la façon de s'y prendre car il pourrait y avoir plus d'une <recherche> .... tag </recherche > dans le contenu HTML.

Toute aide avec des exemples est appréciée.

Répondre

2

Quelque chose comme cela devrait fonctionner:

string data = @"some text <search>search term 1</search> some more text <search>another search term</search>"; 
Console.WriteLine(Regex.Replace(data, @"(?:<search>)(.*?)(?:</search>)", @"<a href=""http://www.google.com/?q=$1"">$1</a>")); 
+0

Cela fonctionne parfaitement, pouvez-vous le faire à l'envers? convertir le

1

Vous devriez envisager d'utiliser un DOM HTML pour analyser le contenu plutôt que des expressions régulières. Les expressions régulières destinées à analyser le HTML sont connues pour être à la fois compliquées et avoir des bogues inattendus.

+0

pouvez-vous donner un exemple sur la façon d'utiliser html dom pour une balise personnalisée comme celle que je veux utiliser? –

+0

Voir la réponse plus complète de DanHerbert – configurator

0

Devrait être assez facile avec la correspondance gloutonne, en supposant que vous ne pouvez pas imbriquer les balises de recherche.

Remplacement sur

<search>(.*?)</search> is going to be key.

1

Vous pouvez essayer

Regex.Replace(strMyHtmlInputString, "\<search\>(.+?)\<\/search\>", "www.google.com/?q=\1") 

Le point d'interrogation dans le premier groupe signifie "groupe aussi peu que possible pour correspondre à ce groupe".

1

expressions régulières sont mauvaises à des données XML handing/HTML. Il vaut mieux utiliser une vraie API de lecture HTML ou XML. Les expressions régulières rencontrent des problèmes lorsque vous traitez du code HTML contenant des balises imbriquées, par exemple.

Si vous obtenez le tag-soup HTML, que vous êtes probablement, vous ne pourrez pas utiliser la classe XmlDocument native de .NET sans trop de stress. Vous devriez regarder dans le HtmlAgilityPack, qui a une API exactement comme le XmlDocument, mais il inclut certaines choses spécifiques au HTML telles que le nettoyage du HTML pour être bien formé.

Cet exemple utilise la classe XmlDocument, mais l'utilisation du HtmlDocument de HtmlAgilityPack doit être très similaire (en utilisant uniquement un objet HtmlDocument au lieu d'un objet XmlDocument). Cela devrait remplacer le tag <search /> par le lien vers Google.

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xml); 
XmlNode searchTag = doc.SelectSingleNode("//search"); 
XmlElement linkTag = doc.CreateElement("a"); 
linkTag.InnerXml = searchTag.InnerXml; 
linkTag.Attributes["href"].Value = "http://google.com/?q=" + linkTag.InnerText; 
searchTag.ParentNode.ReplaceChild(searchTag, linkTag); 

Avertissement: Je ne l'ai pas testé ce code exemple ci-dessus, mais il devrait fonctionner.

Questions connexes