【问题标题】:How can I validate a website URL in Perl?如何在 Perl 中验证网站 URL?
【发布时间】:2026-02-21 04:35:01
【问题描述】:

我需要一个正则表达式或模块来使用 Perl 验证网站 URL。

【问题讨论】:

  • 您需要提供更多信息。你为什么需要它?什么是“网站网址”?
  • 为什么需要验证 URL?你从哪里得到它们,你用它们做什么。
  • @Jens 我想网站网址是指那些包含 http 或 https 服务标识符的网址。否则,网址可能包含类似:news:alt.rec.motorcycle 或 gopher://gumby.brain.headache.edu:151/7fonebook.txt

标签: perl url


【解决方案1】:

既然你说的是“网站 URL”,我猜你只对 HTTP 和 HTTPS URL 感兴趣。

为此,您可以使用 Perl 的 Data::Validate::URI 模块,而不是使用正则表达式。

例如,验证 HTTP 和 HTTPS URL:

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)

并且,仅验证 HTTP URL:

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

最后,验证任何格式正确的 URI:

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

如果出于某种原因,您实际上需要一个正则表达式,那么您可以使用类似以下的方法来验证 HTTP/HTTPS/FTP/SFTP URL:

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

【讨论】:

    【解决方案2】:
     use Regexp::Common qw /URI/;
        while (<>) {
            /($RE{URI}{HTTP})/       and  print "$1 is an HTTP URI.\n";
        }
    

    【讨论】:

    • 网站 URL 可以是 HTTP 或 HTTPS。
    【解决方案3】:

    我不使用正则表达式。我尝试创建一个 URI 对象,看看会发生什么。如果可行,我有一个 URI 对象,我可以查询该对象以获取方案(其他东西变成“无方案”URI)。

    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
    

    如果我正在寻找特定类型的 URI,我可以查询该对象以查看它是否满足我需要的任何内容,例如特定的域名。如果我用 URL 做一些事情,我可能无论如何都会创建一个对象,所以我不妨从它开始。

    【讨论】:

    • @brian,您的脚本看起来不太正确。我想如果没有 http 服务标识符,www.example.com 仍然是一个有效的 url,但脚本却相反。
    • 主机名不是 URL。如果没有方案,www.example.com 可能是主机名、文件或其他内容。没有任何魔法可以单独区分这些东西。它是提供内容上下文和含义的 URL。
    • 好吧,看来 Regexp::Common qw/URI/ 做同样的事情。但是如果有人要手动写下很多没有http标识符的url,这些url会不会被认为是有效的?
    • 我想我刚刚回答了。
    • 你所谓的“服务标识符”实际上被称为“方案”,这就是我一直使用这个术语的原因。
    【解决方案4】:

    【讨论】:

    • 网站 URL 可以是 HTTP 或 HTTPS。