regexs peut prouver un bon point de départ pour cela, bien que les URIs et les URL sont notoirement difficiles à correspondre avec un seul motif.
Pour illustrer, le plus simple des modèles semble assez compliqué (en Perl 5 notation):
\w+:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*
Ce sélectionnne http://example.com/foo/bar-baz
et ftp://192.168.0.1/foo/file.txt
mais poserait des problèmes pour au moins ceux-ci:
mailto:[email protected]
(pas de match - pas //
, mais présente @
)
ftp://192.168.0.1.2
(le match, mais trop de chiffres, il est donc pas un URI valide)
ftp://1000.120.0.1
(correspondance, mais les besoins d'adresse IP nombres compris entre 0 et 255, donc il n'y a pas un URI valide)
nonexistantscheme://obvious.false.positive
http://www.google.com/search?q=uri+regular+expression
(le match, mais requête n'est pas Je pense que c'est un cas de la règle 80/20. Si vous voulez attraper la plupart des choses, alors je ferais comme suggéré de trouver une expression régulière décente si vous ne pouvez pas en écrire une vous-même.
Si vous examinez du texte provenant de sources assez contrôlées (par exemple générées par une machine), vous obtiendrez alors le meilleur plan d'action.
Si vous avez absolument besoin d'attraper chaque URI que vous rencontrez, et que vous regardez du texte dans la nature, alors je pense que je chercherais n'importe quel mot avec deux points dedans, par exemple. \s(\w:\S+)\s
. Une fois que vous avez un candidat approprié pour un URI, passez-le à un vrai analyseur d'URI dans la classe URI de la bibliothèque que vous utilisez. Si vous êtes intéressé par pourquoi il est si difficile d'écrire un modèle d'URI, je suppose que la définition d'un URI est faite avec un Type-2 grammar, alors que les expressions régulières ne peuvent analyser que les langues de Type-3 grammars.
Vous pouvez jeter un oeil au code source de [Regexp :: Common :: URI] (http://search.cpan.org/~abigail/Regexp -Common-2.122/lib/Regexp/Common/URI.pm). – cubex
Une liste de [Schémas URI officiels IANA enregistrés] (http://en.wikipedia.org/wiki/URI_scheme#Official_IANA-registered_schemes) peut être trouvée dans Wikipedia. Je suis d'accord que la recherche sur le web pour une expression régulière premade pourrait être la meilleure idée. –