2009-09-02 6 views
2

J'ai une chaîne, et je voudrais trouver tous les caractères supérieurs qui sont ne faisant pas partie de une balise HTML.Stumped sur Regex avec assertion lookbehind positive de largeur nulle

En ignorant CDATA, etc., cela devrait être facile: trouvez un caractère ">" qui n'a pas de "<" avant ou un autre ">" entre eux.

est ici la première tentative de solution, je suis venu avec:

(?<=(^|>)[^<]*)> 

Je pense cela devrait chercher tout « > » où il n'y a pas de caractères « < » à gauche de celui-ci, soit de retour à le début de la chaîne, ou retour au ">" précédent.

J'ai essayé le phrasé négativement ainsi:

(?<!<[^>]*)> 

à savoir, un « > » qui est ni précédé d'un « < », à moins que n'est suivi par des non - caractères « > ».

Je pense que je suis juste tordu dans ma tête à propos de la façon dont fonctionnent les lookbehinds.

Tests unitaires:

No match in: <foo> 
No match in: <foo bar> 
Match in: <foo> bar> 
Match in: foo> bar 
Match in: >foo 
Two matches in: foo>> 
Two matches in: <foo> >bar> 

Cas d'utilisation: Je suis d'épuration HTML à partir d'un champ de formulaire type wiki que accepte certaines balises HTML, mais les utilisateurs ne sont pas terriblement HTML avertis et parfois entrer non échappés " > "et" < "littéraux pour des significations réelles inférieures et supérieures. Mon intention est de les remplacer par des entités HTML, mais seulement si elles ne font pas partie d'une balise HTML. Je sais qu'il y a la possibilité qu'ils entrent dans un texte comme "Heigh is < 10 and> 5", ce qui briserait cela, mais c'est un cas limite avec lequel je peux travailler ou vivre.

+0

'(? ] *)>' –

+0

Désolé, Brad ne fonctionne pas. – richardtallent

+0

Ça vaut le coup de toute façon. –

Répondre

0

Get Expresso, excellent outil pour travailler et écrire regexes

Mais pour être honnête, je ne sais pas si vous pouvez écrire un à faire ce que vous avez besoin.
N'oubliez pas, certaines balises html n'ont pas besoin d'être fermées pour être html valide, et d'autres sont à fermeture automatique dans xhtml.

eg. <hr>, <br/>, <p>, <li> <img> or <img /> etc 

Vous pourriez être mieux, juste garder une liste de balises valides, changer tous < et> direction &lt; et &gt; qui ne font pas partie des balises valides.

+0

Cette réponse serait meilleure si elle fournissait [un lien vers l'outil mentionné] [1]. [1]: http://www.ultrapico.com/Expresso.htm – jwfearn

3

Ceci est beaucoup plus compliqué qu'il n'y paraît au premier abord (comme vous le découvrez). Il est beaucoup plus facile d'y arriver de l'autre côté: utilisez une regex pour faire correspondre une balise HTML OU une équerre. Si c'est un tag que vous avez trouvé, vous le rebranchez; sinon vous le convertissez. Remplacer méthode avec un paramètre MatchEvaluator est bon pour que:

static string ScrubInput(string input) 
{ 
    return Regex.Replace(input, @"</?\w+>|[<>]", GetReplacement); 
} 

static string GetReplacement(Match m) 
{ 
    switch (m.Value) 
    { 
    case "<": 
     return "&lt;"; 
    case ">": 
     return "&gt;"; 
    default: 
     return m.Value; 
    } 
} 

Vous remarquerez que mon tag regex - </?\w+> - est plus restrictive que la vôtre. Je ne sais pas si le mien est exactement pour vos besoins, mais je déconseille d'utiliser <[^<>]+> - il trouverait une correspondance dans quelque chose comme "if (x<3||x>9)".

Questions connexes