2008-11-20 9 views
0

Je dois tester les URL générales en utilisant n'importe quel protocole (http, https, shttp, ftp, svn, mysql et des choses que je ne connais pas).J'ai besoin d'un regEx pour faire correspondre les URLs générales

Ma première passe est la suivante:

\w+://(\w+\.)+[\w+](/[\w]+)(\?[-A-Z0-9+&@#/%=~_|!:,.;]*)? 

(PCRE et .NET donc rien à la fantaisie)

+0

Cette expression correspond trop (_ ne sont pas autorisés dans les noms de domaine, IIRC, URL peut arrêter après le nom de domaine) et pas assez (on peut trouver ~ et n'importe quel caractère% hh dans le chemin). – PhiLho

Répondre

3

Selon RFC2396:

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 
+0

OK donc le Windows // serveur/dir/fichier est une URL? sorte de faire le fichier: //// serveur/dir/fichier dans FF/IE regarder encore plus bazaar – BCS

+0

c'est une regex assez dangereux. En fait, il capture tout le texte avant et après l'URL. Cela ne fonctionne pas pour mes fins. Je vérifierai certainement ceci avant de l'utiliser. – bgenchel

1

ajoutant que RegEx comme réponse wiki:

[\w+-]+://([a-zA-Z0-9]+\.)+[[a-zA-Z0-9]+](/[%\w]+)(\?[-A-Z0-9+&@#/%=~_|!:,.;]*)? 

option 2 (Re CMS)

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 

Mais c'est à laxisme pour tout ce qui est sain d'esprit afin de le rendre plus restrictif et de différencier les autres choses.

proto  :// name  : pass  @ server :port  /path  ? args 
^([^:/?#]+)://(([^/?#@:]+(:[^/?#@:]+)[email protected])?[^/?#@:]+(:[0-9]+)?)(/[^?#]*)(\?([^#]*))? 
+0

Une autre possibilité est 'svn + ssh: //'. Je ne pense pas que \ w correspondrait à '+'. – brasskazoo

+0

Vous avez raison, au moins dans le contexte de PCRE. –

0

Je suis venu à ce d'une direction légèrement différente. Je voulais émuler la capacité de gchats à correspondre something.co.uk et le lier. Donc, je suis allé avec une regex qui cherche un . sans une période suivante ou un espace de chaque côté, puis attrape tout ce qui l'entoure jusqu'à ce qu'il frappe les espaces. Il correspond à une période à la fin d'un URI mais je l'enlève plus tard. Donc, cela pourrait être une option si vous préférez des faux positifs sur manque certains potentiels

url_re = re.compile(r""" 
      [^\s]    # not whitespace 
      [a-zA-Z0-9:/\-]+ # the protocol and domain name 
      \.(?!\.)   # A literal '.' not followed by another 
      [\w\-\./\?=&%~#]+ # country and path components 
      [^\s]    # not whitespace""", re.VERBOSE) 

url_re.findall('http://thereisnothing.com/a/path adn some text www.google.com/?=query#%20 https://somewhere.com other-countries.co.nz. ellipsis... is also a great place to buy. But try text-hello.com ftp://something.com') 

['http://thereisnothing.com/a/path', 
'www.google.com/?=query#%20', 
'https://somewhere.com', 
'other-countries.co.nz.', 
'text-hello.com', 
'ftp://something.com'] 
Questions connexes