2013-06-04 2 views
-1

Ne peut pas comprendre, pourquoi mon expression rationnelle ne trouve pas seulement des caractères alpha?Chaîne Regexp seulement trouve également des caractères spéciaux

Le motif:

([\<])([^\>]{1,})([a-zA-Z])([\>]) 

L'exemple

-------- Original Message -------- 
Subject: This is plain test 
Date: Tue, 04 Jun 2013 13:26:04 +0000 
From: Hello there <[email protected]> 
To:  [email protected] <[email protected]> 

Hello! This is plain mail! 
<[email protected]></[email protected]> 
No html is inserted. No no! 
<man2></man2> 
Why do you found this < something inside this>??? 

expression a trouvé les adresses e-mail et les balises HTML non valides! J'ai besoin, donc pas de balises invalides et aucune adresse e-mail ne correspondra en raison de l'analyse du texte pour les balises html valides. Qu'est-ce qui ne va pas avec ce modèle et pourquoi cela correspond-il aux tags et emails non valides?

Voici le lien pour mes tests. http://regexr.com?353v9

+2

Vous aurez besoin de nous dire ce que vous voulez faire correspondre et ce qui ne va pas avec ce qu'il correspond maintenant si vous voulez une meilleure aide comment réparer votre modèle. – iamnotmaynard

Répondre

1

Ce simple devrait répondre à vos besoins:

</?[a-zA-Z0-9]+?> 

Demo

+0

Merci à tous. Beaucoup de vos réponses sont bonnes! –

0

Votre deuxième groupe ([^\>]{1,}) trouve un ou plusieurs caractères qui ne se ferment pas équerres > - cela comprend les lettres, les chiffres, et, bien, tout ce qui est pas un >. Je crois que c'est pourquoi vos matchs ne sont pas ce que vous attendez; C'est difficile à savoir puisque vous n'avez pas dit exactement ce que vous essayez de faire correspondre, quelles sont les chaînes qui correspondent au modèle, ou ce qui ne va pas avec les matchs.

0

Si je comprends votre requête correctement, vous voulez éliminer des problèmes, par exemple < > @ /?

Si tel est le cas, vous pouvez utiliser ^[^\<\>\/\\\'\"]*$ pour faire correspondre à tous sauf < >/\ ' ".

0

Brisons votre regex (groupes):

  1. ([\<]) = exactement un <
  2. ([^\>]{1,}) = tout caractère qui est pas un >, une ou plusieurs fois
  3. ([a-zA-Z]) = exactement un caractère alphabétique en minuscule ou en majuscule
  4. ([\>]) = Exactement un >

Voilà pourquoi adresses e-mail comme <[email protected]> sont présents:

  1. <
  2. [email protected]
  3. d
  4. >

et les chaînes de tag comme comme <[email protected]>:

  1. <
  2. [email protected]
  3. N
  4. >

ou < something inside this>:

  1. <
  2. something inside thi (y compris l'espace au début)
  3. s
  4. >

<man2> ne correspond pas, parce que le nombre 2 avant la > n'est pas un caractère alpha.

solution de base: Pour faire correspondre les balises typiques HTML, vous pouvez utiliser ([\<]\/?)([a-zA-Z0-9]+)([\>])

  1. ([\<]\/?) = un < ou </ (pour les balises de fermeture)
  2. ([a-zA-Z0-9]+) = un ou plusieurs caractères alphanumériques (pour soutenir <h2> etc) caractères - le nom de l'élément HTML
  3. ([\>]) = un >

Notez que ceci ne prend pas en charge la notation de balise vide XHTML comme <br /> ou <br/>, ni les balises avec des attributs comme <a href="http://example.com">.Il y a beaucoup de ressources regex là-bas avec un tas de modèles pour les balises HTML, validation d'adresse e-mail, etc.

Edit: Si vous faites tout filtrage, assurez-vous de ne pas dépouiller juste de sortir > caractères que ceux-ci sont couramment utilisé dans les messages électroniques en texte brut pour indiquer des blocs de citation lors de la réponse.

Questions connexes