2010-03-17 6 views
1

Oui, je sais que généralement une mauvaise idée pour analyser HTML utilisant l'expression rationnelle, mais à part quelqu'un peut-il expliquer la faute ici:Quel est le problème avec mon regex

string outputString = Regex.Replace(inputString, @"<?(?i:script|embed|object|frameset|frame|iframe|metalink|style|html|img|layer|ilayer|meta|applet)(.|\n)*?>", ""); 
if (outputString != inputString) 
{ 
    Console.WriteLine("unwanted tags detected"); 
} 

Il détecte certainement les balises prévues comme: <script> et <html> , mais il rejette aussi les chaînes que je veux permettre, comme <B>Description</B> et <A href="http://www.mylink.com/index.html">A Link containing 'HTML'</A>

+5

facile: vous analysez html avec une expression régulière (RNCS) – soulmerge

+1

Peut-être que je me pose la mauvaise question. Comment détecteriez-vous les balises indésirables dans l'entrée html? –

Répondre

2

Je pense le problème est le premier point d'interrogation dans

<?(?i:script 

Vous voulez probablement faire correspondre le premier caractère "/" dans une balise html de fermeture, non? Je pense que le point d'interrogation rend le "<" facultatif (zéro ou une correspondance).

Je suggère d'utiliser

<(/)?(?i:script 

mais je ne suis pas RegEx expert ...

+0

Merci cela a bien fonctionné –

+0

Correct, mais vous n'avez pas besoin des parenthèses; '

1

Je ne sais pas comment vous faites cela en C#, mais il semble que vous avez oublié de faire votre cas regexp insensible.

+2

En fait, il n'a pas l'expression '(? I: ...)' rend le cas RegEx insensible dans cette partie. –

+0

à droite. ma faute. C# n'est pas mon moteur de regexp natif. –

1

D'après ce que je vois juste besoin d'un petit coup de coude:

Changement de

"<?(?i:script|...|applet)(.|\n)*?>" 

à

"\<(?i:script|...|applet)(.|\n)*?\>" 

Comme les personnages < et > sont spéciaux

+0

Je l'ai essayé, mais désolé cela ne fonctionne pas - :( –

+0

Non, '<' and '> 'n'a pas de signification particulière dans les expressions rationnelles En fait, dans les saveurs vous * leur donnez une signification particulière en ajoutant des barres obliques inverses:' \ <'correspond le début d'un mot et '\>', la fin d'un mot –

0

je changerais

"<?(?i:script|...|meta|applet)(.|\n)*?>" 

à

"</?(?:script|...|meta|applet)[^>]*>" 

Je ne suis pas tout à fait familier avec Javascript Regex cordes, mais j'ai une référence et je suis familier avec les bases de regex (et de temps en temps j'ai besoin d'un rappel).

le \ s est entièrement facultatif - il n'est pas nécessaire. vous pouvez le garder si vous le souhaitez. Notez que cela ne gère pas les majuscules. vous devrez les traiter comme des cas supplémentaires.

vous devrez peut-être échapper à/dans la chaîne. vous n'avez pas besoin d'un? après le * parce que * signifie 0 à plusieurs, de sorte que couvre optionnel.

Je ne suis pas sûr, mais je ne pense pas que le gourmand * dépassera le (? :).

http://www.regular-expressions.info/quickstart.html

Questions connexes