2010-11-25 19 views
0

Je veux détecter, dans une chaîne JavaScript, s'il y a des balises sauf une liste que j'ai. Cela signifie que si dans ma chaîne il y a des tags indésirables, alors je les détecte.Comment détecter un sous-ensemble de tags avec regexp en JavaScript?

Ce que je l'ai fait est:

var expression = new RegExp("<[^(BR|SPAN|STRONG|STRIKE|EM|U|FONT)]*>", "gi"); 

if (expression.test(aString)) { 
     // detection 
} 

Mais ce ne regex semble pas fonctionner ..

Quelqu'un at-il une idée?

Répondre

0

Vous voulez probablement quelque chose comme ceci:

var expression = new RegExp("<(BR|SPAN|STRONG|STRIKE|EM|U|FONT) ?[^>]*>", "gi"); 

... et votre test inverse (si cela permet de tester vrai alors les mauvaises balises sont trouvés)

La solution [^...] vous avez essayé seulement fonctionne sur caractères et leurs ensembles, pas sur les chaînes.

Je termine par [^>]*> ce qui signifie "n'importe quelle quantité de tout ce qui n'est pas un >, suivi d'un >", de sorte que vous pourrez également attraper des éléments avec des attributs.

EDIT

Comme MSalters souligné, il semble que je mal lu votre question. Vous ne voulez pas inverser l'expression, mais plutôt, vous voulez faire quelque chose comme ça

var expression = new RegExp("<(?!BR|SPAN|STRONG|STRIKE|EM|U|FONT) ?[^>]*>", "gi"); 

S'il teste vrai alors votre entrée contient des balises qui ne sont pas dans la liste ci-dessus.

+0

Vous avez raison, avec l'inverse du test, votre solution est vraiment bonne. Merci beaucoup pour cette aide! Bonne journée ! –

+0

Ehm, c'est une liste blanche, et le test était déjà "inversé". Avec votre idée, si je coche ' Texte au hasard', le '
' est apparié et le test réussit. La regex _has_ pour détecter la sous-chaîne ''. – MSalters

+0

@MSalters: ah, vous avez raison! J'ai mal lu la question, alors. –

0

Vous pouvez inverser le test que vous voulez, mais c'est très difficile. Ce que vous voulez trouver est à peu près <([^BSEUF].*|U[^ >]+|B|B[^R].*|BR[^ >]+|E|E[^M].*|EM[^ >]+|||||) - J'ai omis la partie qui correspond aux balises fixant avec S, mais vous devriez obtenir le motif. D'abord, j'attrape tout ce qui ne commence pas par B, S, E, U ou F. Ensuite, j'attrape tout ce qui commence par un U, mais a des caractères supplémentaires qui suivent le U (par exemple <UA>). Le troisième cas attrape <B>. Le 4ème cas attrape <BA> et <BAA>. Le 5ème cas attrape <E>. Le 6ème cas attrape <BRA>. Le 7ème cas attrape <EA> et <EAA>, le 8ème cas attrape <EMA>.

Pour finir, vous avez à attraper <SPA>, <SA>, <SPAA>, <SPANA> Etcetera: les tags diffèrent parce qu'ils sont (1) à court, (2) différent après un certain préfixe partagé, ou (3) plus long qu'une étiquette acceptable.

+0

umm ... qu'y at-il à ce problème que nous ne pouvons pas résoudre avec lookahead négatif? –