2010-04-08 3 views
3

J'ai besoin d'une expression régulière pour valider l'URL du site en utilisant Perl.Comment puis-je valider une URL de site Web en Perl?

+0

Vous devez donner plus d'informations. Pourquoi en avez-vous besoin? Qu'est-ce que "l'URL du site"? – Jens

+1

Pourquoi avez-vous besoin de valider les URL? Où les trouvez-vous et que faites-vous avec eux? –

+0

@Jens Je suppose que les URL de sites Web font référence à celles qui incluent les identificateurs de service http ou https. Sinon, les URL peuvent inclure quelque chose comme: news: alt.rec.motorcycle ou gopher: //gumby.brain.headache.edu: 151/7fonebook.txt – Mike

Répondre

3
use Regexp::Common qw /URI/; 
    while (<>) { 
     /($RE{URI}{HTTP})/  and print "$1 is an HTTP URI.\n"; 
    } 
+0

Probablement "est un URI HTTP" est un meilleur exemple à montrer. – ysth

+1

Les URL de site Web peuvent être HTTP ou HTTPS. –

10

Je n'utilise des expressions régulières. J'essaie de créer un objet URI et de voir ce qui se passe. Si cela fonctionne, j'ai un objet URI que je peux interroger pour obtenir le schéma (les autres choses sont transformées en URI "sans schéma").

use URI; 

while(<DATA>) 
    { 
    chomp; 
    my $uri = URI->new($_, 'http'); 
    if($uri->scheme) { print "$uri is a URL\n"; } 
    else    { print "$uri is not a URL\n"; } 
    } 

__END__ 
foo.html 
http://www.example.com/index.html 
abc 
www.example.com 

Si je suis à la recherche d'une sorte spécifique d'URI, je peux interroger l'objet pour voir si elle satisfait tout ce que je dois, comme un nom de domaine particulier. Si je fais quelque chose avec des URLs, je vais probablement faire un objet de toute façon, donc je ferais mieux de commencer par le faire.

+0

@brian, votre script ne semble pas tout à fait correct. Je suppose que sans l'identifiant de service http, www.example.com serait toujours une URL valide mais le script dit le contraire. – Mike

+2

Un nom d'hôte n'est pas une URL. Sans schéma, www.example.com peut être un nom d'hôte, un fichier ou autre. Il n'y a pas de magie qui distingue ce genre de choses tout seul. C'est l'URL qui donne le contexte et la signification. –

+0

Eh bien, il semble que Regexp :: Common qw/URI/fait la même chose. Mais si quelqu'un doit écrire manuellement beaucoup d'URL sans identifiants http, ces URL ne seront-elles pas considérées comme valides? – Mike

2

Puisque vous parlez d '"URL de site Web", je suppose que vous êtes intéressé par les URL HTTP et HTTPS seulement. Pour cela, au lieu d'utiliser regex, vous pouvez utiliser le module Perl Data::Validate::URI de Perl. Pour cela, vous pouvez utiliser le module .

Par exemple, pour valider les URL HTTP et HTTPS:

use Data::Validate::URI; 
my $url = "http://google.com"; 
my $uriValidator = new Data::Validate::URI(); 

print "Valid web URL!" if $uriValidator->is_web_uri($url) 

Et, pour valider l'URL HTTP uniquement:

print "Valid HTTP URL!" if $uriValidator->is_http_uri($url) 

Enfin, pour valider une URI bien formaté:

print "Valid URI!" if $uriValidator->is_uri($url) 

Si à la place, pour une raison quelconque, vous voulez réellement une regex, alors vous pouvez utiliser quelque chose comme ce qui suit pour valider URL HTTP/HTTPS/FTP/SFTP:

print "Valid URL!\n" if $url =~ /^(?:(?:https?|s?ftp))/i; 
Questions connexes