2009-08-29 8 views
3

Pour l'instant j'utilise cette expression rationnelle:Quelle est l'expression régulière pour valider jabber id?

^\A([a-z0-9\.\-_\+]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z$ 

Je pense qu'il est pas très bon. Alors quelle est la meilleure expression régulière que vous avez ou avez vu pour valider des jids?

Pour référence, Section 3 of the XMPP core standard définit un JID dans Backus-Naur comme

jid    = [ node "@" ] domain [ "/" resource ] 
domain   = fqdn/address-literal 
fqdn   = (sub-domain 1*("." sub-domain)) 
sub-domain  = (internationalized domain label) 
address-literal = IPv4address/IPv6address 
+2

Il serait utile que vous fournissiez les règles qui constituent un identifiant jabber légal. – Pinochle

+0

ire_and_curses déjà fixé mon oubli, merci. –

+1

Je ne pense pas que vous réalisiez combien vous demandez. Cette tâche est très similaire à la validation d'une adresse e-mail, qui est très, très compliquée et pas bien adaptée aux expressions régulières. Check this out: http://www.regular-expressions.info/email.html –

Répondre

5

Votre regexp est erroné au moins dans ce qui suit points:

  1. Il faut jid pour contenir un '@', tu gh jids sans '@' peut aussi être valide.
  2. Il ne vérifie pas la longueur maximale (mais le lien fourni dit: « Chaque partie admissible d'un JID NE DOIT PAS être plus de 1023 octets »)

Je pense avoir un énorme regexp est mauvaise façon d'y aller. Vous feriez mieux d'écrire un peu plus de code, en divisant le jid en parties plus petites (domaine, noeud, ressource) et en vérifiant chacune de ces parties. Ce serait mieux de multiples points:

  • test plus facile (vous pouvez tester l'unité chacune des parties indépendamment)
  • meilleure performance
  • code plus simple
  • réutilisabilité
  • etc.
+0

Merci pour le conseil. –

7

Essayez ceci:

^(?:([^@/<>'\"]+)@)?([^@/<>'\"]+)(?:/([^<>'\"]*))?$ 

Ce n'est pas tout à fait, car il y a beaucoup de choses qui correspondent à ce qui ne sont pas JID valides, en particulier dans la partie du nom de domaine. Cependant, il doit autoriser et analyser tous les JID valides, le groupe 1 étant le nœud, le groupe 2 étant le domaine et le groupe 3 étant la ressource.


données de test:

foo     (None, 'foo', None) 
[email protected]  ('foo', 'example.com', None) 
[email protected]/bar ('foo', 'example.com', 'bar') 
example.com/bar  (None, 'example.com', 'bar') 
example.com/[email protected] (None, 'example.com', '[email protected]') 
example.com/bar/baz (None, 'example.com', 'bar/baz') 
bä[email protected]ämple.com/bäz ('bär', 'exämple.com', 'bäz') 

En plus: si vous n'êtes pas familier avec la construction (:), il est un ensemble de parens qui n'ajoute pas un groupe à la sortie.

Questions connexes