2010-03-15 4 views
3

je la chaîne suivante:Expression régulière pour remplacer des guillemets dans les balises HTML ne

<div id="mydiv">This is a "div" with quotation marks</div> 

Je veux utiliser des expressions régulières pour retourner les éléments suivants:

<div id='mydiv'>This is a "div" with quotation marks</div> 

Remarquez comment l'attribut id dans le div est maintenant entouré d'apostrophes?

Comment est-ce que je peux faire ceci avec une expression régulière?

Éditer: Je ne suis pas à la recherche d'une balle magique pour gérer tous les cas de bord dans toutes les situations. Nous devrions tous être fatigués d'utiliser regex pour analyser HTML, mais, dans ce cas particulier et pour mon besoin particulier, regex EST la solution ... J'ai juste besoin d'un peu d'aide pour obtenir la bonne expression. Jens a aidé à trouver une solution pour moi, mais toute personne venant au hasard sur cette page devrait réfléchir longuement et très fort à l'utilisation de cette solution. Dans mon cas cela fonctionne parce que je suis très confiant sur le type de cordes que je vais traiter. Je connais les dangers et les risques et je fais en sorte de le faire. Si vous n'êtes pas sûr si vous le savez, cela indique probablement que vous ne connaissez pas et ne devriez pas utiliser cette méthode. Tu as été prévenu.

+2

pas encore ... o_0 –

+6

http://stackoverflow.com/questions/1732348/regex-match-open -tags-except-xhtml-self-contained-tags – SLaks

+0

Juste par curiosité, en quoi les attributs sont-ils placés entre guillemets simples ou doubles? – Amarghosh

Répondre

3

Cela pourrait se faire de la façon suivante: Je pense que vous voulez remplacer toutes les occurrences de ", qui est entre un < et un > avec '. Donc, vous recherchez chaque " dans votre fichier, regardez derrière pour un <, et devancez un >. Le regex ressemble:

(?<=\<[^<>]*)"(?=[^><]*\>) 

Vous pouvez remplacer les caractères trouvés à votre goût, en utilisant peut-être Regex.Replace.

Note: Bien que je trouve la communauté Stack Overflow plus conviviale et utile, ces questions Regex/HTML sont traitées avec un peu trop de colère, à mon avis. Après tout, cette question ne demande pas "Qu'est-ce regex correspond à tout le HTML valide, et ne correspond à rien d'autre."

+0

Merci. Je vais donner un coup de feu. – Cindyydnic

+0

Que faire si vous avez un '>' dans une chaîne entre guillemets? Avant de commencer à essayer de modifier la regex pour anticiper toutes les possibilités, il semble que vous voulez jeter un oeil à http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained -tags – Cascabel

+0

J'ai fait une petite erreur. Modification pour obtenir la version de travail. =) – Jens

0

Vous pouvez faire correspondre:

(<div.*?id=)"(.*?)"(.*?>) 

et le remplacer par:

$1'$2'$3 
0

Je vois que vous êtes au courant des dangers de l'utilisation Regex pour faire ce genre de remplacement. J'ai ajouté la réponse suivante pour ceux qui sont à la recherche d'une méthode beaucoup plus «stable» si vous voulez avoir une solution qui continuera de fonctionner au fur et à mesure que les documents d'entrée changent.

Utilisation du HTML Agilité pack (project page, nuget), cela ne l'astuce:

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml("your html here"); 
// or doc.Load(stream); 

var nodes = doc.DocumentNode.DescendantNodes(); 

foreach (var node in nodes) 
{ 
    foreach (var att in node.Attributes) 
    { 
     att.QuoteType = AttributeValueQuote.SingleQuote; 
    } 
} 

var fixedText = doc.DocumentNode.OuterHtml; 
//doc.Save(/* stream */);