2009-12-29 6 views
2

J'ai besoin d'aide pour créer une expression régulière qui puisse correspondre correctement à une URL dans un texte libre.Correspondant correctement à une URL IDN

  • système
    • un des éléments suivants: ftp, http, https (est FTPS un protocole?)
  • option utilisateur (et en option passe)
  • hôte (avec support pour IDN)
    • support pour www et sous-domaine (s) (avec support pour IDN)
    • filtrage de base du TLD ([a-zA-Z]{2,6} est assez, je pense)
  • option Port numéro
  • chemin (en option, avec un support pour les caractères Unicode)
  • requête (en option, avec un support pour les caractères Unicode)
  • fragment (en option, avec un support pour les caractères Unicode)

Voici ce que je pourrais en savoir plus sur les sous-domaines:

A « sous-domaine » eXPRIME relatif dépendance, et non la dépendance absolue: par exemple, wikipedia.org comprend un sous-domaine du domaine org, et fr.wikipedia.org comprend un sous domaine du domaine wikipedia.org. En théorie , cette subdivision peut descendre à 127 niveaux de profondeur, et chaque étiquette DNS peut contenir jusqu'à 63 caractères, comme longtemps que l'ensemble nom de domaine ne dépasse pas une longueur totale de 255 caractères.

En ce qui concerne le nom de domaine lui-même, je ne pouvais pas trouver une source fiable mais je pense que l'expression régulière pour les non-IDNs (Je ne sais pas comment écrire une version compatible IDN) est quelque chose comme:

[0-9a-zA-Z][0-9a-zA-Z\-]{2,62} 

que quelqu'un peut me aider avec cette expression régulière ou me pointer vers une bonne direction?

+0

Avec "support pour IDNs", voulez-vous dire qu'il devrait soutenir www.emilvikström.se ou juste la version punycode www.xn--emilvikstrm-0fb.se? –

+0

@Emil: emilvikström.se, je crois que je devrais utiliser la propriété '\ p {L}' mais je ne suis pas sûr. –

Répondre

4

John Gruber, de Daring Fireball renommée, avait a post recently qui a détaillé sa quête d'une bonne URL reconnaissant la chaîne regex. Ce qu'il est venu avec était le suivant:

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))

Ce qui ne semble OK avec les URL contenant Unicode, ainsi. Vous aurez besoin de faire la légère modification pour obtenir le reste de ce que vous cherchez - le schéma, le nom d'utilisateur, mot de passe, etc Alan Storm wrote a piece explaining Gruber's regex pattern, dont j'avais absolument besoin (regex est tellement écrit une seule fois -no-indice-comment-lire-toujours-encore!).

+0

Ceci est probablement utile si vous ajoutez le nom d'utilisateur et le mot de passe (protocole: // nom d'utilisateur: [email protected]/path?querystring # anchor) –

+2

J'ai testé ce modèle pour que l'URL soit complète. Il est peut-être plus simple d'exécuter les URL trouvées via parse_url() par la suite. –

+0

@delfuego: Comment cette regex diffère-t-elle de celle-ci '(?: [\ W-] +: //? | Www [.]) [^ \ S <>] + (?: [^ [: Punct:] \ s] | /) '? –

0

Si vous avez besoin du protocole et ne sont pas trop inquiet au sujet des faux positifs, de loin la chose la plus facile à faire est de correspondre à tous les caractères non-blancs autour ://

+2

pour éliminer les fausses, exécutez les résultats via 'filter_var' et si cela ne retourne pas false, passez par' parse_url' pour obtenir les composants. – Gordon

0

Cela vous obtiendrez la plupart du chemin . Si vous en avez besoin plus raffiné s'il vous plaît fournir des données de test.

(ftp|https?)://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)? 
+1

Il échoue pour 'http: // www.emilvikström.se /' par exemple. –

+0

Est-ce une URL valide? à partir de http://www.ietf.org/rfc/rfc1738.txt ... seulement alphanumériques, les caractères spéciaux "$ -_. +! * '(),", et les caractères réservés utilisés à des fins réservées peuvent être utilisés non codé dans une URL. –

+2

Voir RFC3490 sur les noms de domaine internationalisés. En termes techniques comme DNS, il est toujours converti en punycode, mais il est montré dans les applications avec les caractères internationaux. –