Question

Je suis en train de convertir toutes les instances du> caractère à son entité HTML équivalente,>, dans une chaîne de HTML contenant des balises HTML. Le plus loin que je suis en mesure d'obtenir une solution pour cela est d'utiliser une expression régulière.

Voici ce que j'ai à ce jour:

        public static readonly Regex HtmlAngleBracketNotPartOfTag = new Regex("(?:<[^>]*(?:>|$))(>)", RegexOptions.Compiled | RegexOptions.Singleline);

Le principal problème que je vais avoir est d'isoler les simples> caractères qui ne font pas partie d'une balise HTML. Je ne veux pas convertir les balises existantes, parce que je dois préserver le code HTML pour le rendu. Si je ne convertit pas les caractères>, je reçois HTML malformé, ce qui provoque des problèmes de rendu dans le navigateur.

Ceci est un exemple d'une chaîne de test pour analyser:

"Ok, now I've got the correct setting.<br/><br/>On 12/22/2008 3:45 PM, jproot@somedomain.com wrote:<br/><div class"quotedReply">> Ok, got it, hope the angle bracket quotes are there.<br/>><br/>> On 12/22/2008 3:45 PM, > sbartfast@somedomain.com wrote:<br/>>> Please someone, reply to this.<br/>>><br/>><br/></div>"

Dans la chaîne ci-dessus, aucun des caractères> qui font partie des balises HTML doit être converti en>. Donc, ceci:

<div class"quotedReply">>

devrait devenir ceci:

<div class"quotedReply">&gt;

Une autre question est que l'expression ci-dessus utilise un groupe non-capture, ce qui est bien à l'exception du fait que le match est dans le groupe 1. Je ne suis pas tout à fait sûr de savoir comment faire un remplacement uniquement sur le groupe 1 et préserver la reste du match. Il semble qu'un MatchEvaluator ne pas vraiment faire l'affaire, ou peut-être je ne peux pas l'imaginer en ce moment.

Je soupçonne mon regex pourrait faire avec Lovin'.

Quelqu'un a des idées claires?

Était-ce utile?

La solution

L'astuce est de capturer tout ce qui ne sont pas la cible, puis rebranchez-le avec le texte modifié, comme ceci:

Regex.Replace(str, @"\G((?>[^<>]+|<[^>]*>)*)>", "$1&gt;");

Mais à Anthony: crochets à angle droit dans les nœuds de texte ne devrait pas causer de problèmes. Et avec HTML correspondant regexes est délicat; par exemple, les commentaires et CDATA peuvent contenir pratiquement tout, donc une regex robuste devrait faire correspondre spécifiquement.

Autres conseils

Pourquoi voulez-vous faire? Quel mal sont les> faire? La plupart des parseurs que j'ai rencontré sont très heureux avec> sur lui-même sans avoir besoin d'être échappé à une entité.

En outre, il serait plus approprié de coder correctement les chaînes de contenu avec HtmlUtilty.HtmlEncode avant de les concaténer avec des chaînes contenant des balises HTML, donc si cela est sous votre contrôle, vous devriez envisager de traiter avec là.

Peut-être lire votre code HTML dans un analyseur XML qui devrait prendre en charge des conversions pour vous.

Vous parlez des> caractères à l'intérieur d'une balise HTML, (comme dans innerText Java), ou dans la liste des arguements d'une balise HTML?

Si vous voulez simplement désinfectez le texte entre la balise d'ouverture et de fermeture, qui devrait être assez simple. Il suffit de localiser tout> char, et le remplacer par le >. (Je voudrais aussi le faire avec le < étiquette), mais le moteur de rendu HTML DEVRAIT prendre soin de cela pour vous ...

Donner un exemple de ce que vous essayez d'aseptiser, et nous peut-être une trouver la meilleure solution pour elle.

Larry

Pouvez-vous lire la chaîne dans un document XML et regardez les valeurs et remplacer le > avec &gt; dans les valeurs. Cela nécessiterait va récursive dans chaque nœud dans le document, mais cela ne devrait pas être trop difficile à faire.

steve_c, vous pouvez essayer RegEx. Cela donnera la capture des balises HTML en référence 1, et le texte entre les balises sont stockées dans la capture 2. Je ne tester pas complètement cela, il suffit de le jeter là-bas dans le cas où il pourrait être utile.

<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top