Expression régulière pour remplacer les guillemets dans les balises HTML uniquement

asp.net c# html-agility-pack regex

Question

J'ai la chaîne suivante:

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

Je souhaite utiliser des expressions régulières pour renvoyer les éléments suivants:

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

Remarquez comment l'attribut id dans la div est maintenant entouré par des apostrophes?

Comment puis-je faire cela avec une expression régulière?

Edit: Je ne cherche pas de solution miracle pour gérer chaque cas de figure dans chaque situation. 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.

Edit # 2: Jens m'a aidé à trouver une solution, mais toute personne visitant cette page au hasard devrait réfléchir longuement à l'utilisation de cette solution. Dans mon cas, cela fonctionne parce que je suis très confiant du type de chaînes que je vais traiter. Je connais les dangers et les risques et je m'assure de le faire. Si vous n'êtes pas sûr de savoir, cela signifie probablement que vous ne savez pas et que vous ne devriez pas utiliser cette méthode. Tu as été prévenu.

Réponse acceptée

Cela pourrait se faire de la manière suivante: je pense que vous voulez remplacer chaque instance de " , c'est-à-dire entre un < et un > par ' .

Ainsi, vous recherchez chacun " dans votre fichier, recherchez derrière un < , et à l’avance un > . La regex ressemble à ceci:

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

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

Remarque: Bien que la communauté Stack Overflow ait été très amicale et utile, les réponses à ces questions Regex / HTML répondent avec un peu trop de colère, à mon avis. Après tout, cette question ne demande pas "Quelle expression rationnelle correspond à tout le code HTML valide et ne correspond à rien d'autre."


Réponse populaire

Je vois que vous êtes conscient des dangers d’utiliser Regex pour effectuer ce type de remplacement. J'ai ajouté la réponse suivante à ceux qui recherchent une méthode beaucoup plus "stable" si vous souhaitez une solution qui continuera à fonctionner au fur et à mesure que la documentation d'entrée change.

En utilisant le HTML Agility Pack ( page de projet , nuget ), voici ce qui se passe:

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 */);



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi