匹配来自URL的TLD和文件扩展名

时间:2011-07-29 13:07:39

标签: regex perl

我正在开发一个程序,需要从URL中提取TLD和网页扩展

例如:http://www.example.com/somedir/someotherdir/index.html应该为我提供TLD .com和扩展Html

虽然:http://www.example.com.au/somedir/someotherdir/index/应该为我提供TLD .com.au和扩展null

有什么方法可以用Perl中的Regex做到这一点?我在Perl中使用URI模块,但似乎无法执行此类型的提取。

2 个答案:

答案 0 :(得分:3)

如果您使用的是URI模块,则可以轻松提取hostpath。然后,这是一个简单的问题,在最后一个点之后取出所有内容,或相反地删除所有内容,包括最后一个点。您可能希望扩展更复杂,以正确处理没有扩展的情况。

($tld = $uri->host) =~ s/.*\.//;

($extension = $uri->path) =~ s/.*\///;
$extension = '' unless $extension =~ s/.*\.//;

答案 1 :(得分:0)

可以修改RFC-3986 Appendix B中提供的正则表达式来完成此任务:

if ($urltext =~ m!
    ^                 # Anchor to start of string.
    (?:[^:/?#\s]+:)?  # Optional URI scheme.
    //[^:/?#\s]+\.    # Required (non-IP) host (up to TLD)
    ([^:/?#\s.\d]+)   # $1: Top level domain(TLD)
    (?::\d+)?         # Optional port.
    /                 # Required path separator.
    [^?#\s]*\.        # Path up to file extension.
    ([^?#\s.]+)       # $2: File extension.
    (?:\?[^#\s]*)?    # Optional query.
    (?:\#\S*)?        # Optional fragment.
    $                 # Anchor to end of string.
    !x) {
    $tld = $1;
    $ext = $2;
} else {
    # no match
}

(注意:SO语法高亮显示器无法处理Perl'x'模式正则表达式)