2010-01-20 12 views
2

L'expression régulière affichée ci-dessous est utilisée pour récupérer les URL, y compris celles au format example.com. Cependant, je veux seulement pour ramasser sur les URL qui ont un www. ou http, https, etc. En d'autres termes, il devrait ramasser www.example.com. Il ne devrait pas ramasser example.com.Expression régulière pour l'URL

((((ht|f)tp(s?))\://)?((www.|[a-zA-Z])([a-zA-Z0-9\-]+\.)([a-zA-Z]{2,8}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*) 
+0

Alors, ça marche ou quoi? – danben

+0

Etes-vous sûr de vouloir uniquement faire correspondre les domaines américains? D'autres pays ont un point supplémentaire dans la partie TLD: www.bbc.co.uk ou www.tmnet.com.my. – slebetman

+0

Cette expression fonctionne déjà en ce qui concerne la collecte des URL, y compris les sous-domaines. Cela ne fonctionne pas dans le sens où je ne veux que récupérer les URL commençant par www. ou http: Philipp G a résolu ce problème afin que l'expression qu'il a mise à jour soit la meilleure pour moi. – Mike

Répondre

1

Hmmm essayer

(((((ht|f)tp(s?))\://)|(www\.))((|[a-zA-Z])([a-zA-Z0-9-]+.)([a-zA-Z]{2,8}))(\:[0-9]+)*(/($|[a-zA-Z0-9.\,\;\?\'\+&%\$#\=~_-]+))*)

EDIT: Oui, je ne l'ai pas testé vraiment un. Ok, je ne l'ai pas testé, mais celui-ci soit je l'ai regardé très attentivement;)

(((((ht|f)tp(s?))\://)|(www\.))(([a-zA-Z0-9-]+.)?([a-zA-Z0-9]+\.)([a-zA-Z]{2,8}))(\:[0-9]+)*(/($|[a-zA-Z0-9.\,\;\?\'\+&%\$#\=~_-]+))*)

Vous devriez regarder dans un bon testeur de regex. J'utilise habituellement Expresso mais il y en a beaucoup d'autres.

+0

Celui-ci semble coupé au hasard. Par exemple, en essayant http://www.yahoo.com, il coupe le .com. Cela arrive aussi pour d'autres instances où http: // est utilisé, donc ce n'est pas toujours au .com. – Mike

+0

@Mike: Nouvelle expression, essayez-le. – FrustratedWithFormsDesigner

+0

Merci! Ça fonctionne beaucoup mieux. Je vais faire des tests plus approfondis, mais tous les problèmes précédents semblent avoir été résolus. – Mike

0

I modifié votre expression:

((((ht|f)tp(s?))\://)?((www\.)([a-zA-Z0-9-]+\.)([a-zA-Z]{2,8}))(\:[0-9]+)*(/($|[a-zA-Z0-9.\,\;\?\'\+&%\$#\=~_-]+))*) 

Un très bon site pour vérifier vos expressions ici: http://gskinner.com/RegExr/

+0

Cela a fonctionné exactement comme je le voulais. Merci beaucoup! – Mike

+0

Désolé. J'ai répondu trop vite sans trop tester. Il vérifie pour le www. etc. Cependant, il ne récupère plus les URL avec un sous-domaine. – Mike

1

Valider que l'URI est bien formé avec une expression rationnelle - utiliser une de RFC 3986. Validez qu'il est plausible avec le code. Essayer de combiner le chèque pour bien formé et plausible en une seule regexp est trop difficile à obtenir. Voir: Need a regex to validating a Url...

+0

Bon point, probablement plus facile de rejeter des cas spéciaux après avoir vérifié que l'entrée est bien formée. – FrustratedWithFormsDesigner

+0

Je vais essayer. – Mike

0

Ici, vous allez:

\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»“”‘’\s])) 

Il est libéral URL Regex révisé de Daring Fireball.

+0

Merci pour votre aide. Cette expression comprend un problème où il prend tout ce qui est avant un www. ou http: Par exemple: asfjkljswww.yahoo.com L'expression régulière ramasserait tout sur cette ligne, y compris l'asfj-etc. Celui que je publierai ci-dessous semblait être le plus prometteur jusqu'à présent: (((((ht | f) tp (s?)) \: //) | (www \.)) (([A-zA -Z0-9 -] +.)? ([A-zA-Z0-9] + \.) ([A-zA-Z] {2,8})) (\: [0-9] +) * (/($|[a-zA-Z0-9.\,\;\?\'\+&%\$#\=~_-]+))*) Le crédit est attribué à FrustratedWithFormsDesigner pour cette expression. – Mike

+0

@Mike: L'expression régulière que j'ai fournie ne correspond pas 'asfjkljswww.yahoo.com', vérifiez encore. –

+0

Vous avez raison. J'ai dû faire une erreur quand je l'ai copié. Cela fonctionne très bien. Merci de votre aide! – Mike