提取 URL 的一部分

Extracting part of a URL

我使用正则表达式将 URI 提取到 Perl 变量中。我现在需要提取其中的一部分。

例如,假设 </code> 包含 URI 部分,URI 可能有也可能没有查询参数,即它可能采用 <code>/aaa/bbb/ccc/ddd/eee/aaa/bbb/ccc?eee=true&fff=false[=16= 格式]

我想根据 Perl 程序收到的参数提取前 N 个斜杠。例如最多 /aaa/bbb/aaa/bbb/ccc.

我面临的问题是第三个斜线后的部分可能有也可能没有查询参数。

如何忽略查询参数(如果存在)?

使用URI处理URI:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

use URI;

for my $string (qw( /aaa/bbb/ccc/ddd/eee
                    /aaa/bbb/ccc?eee=true&fff=false
)) {
    my $uri = 'URI'->new($string);
    my @path = $uri->path_segments;
    for my $length (1 .. @path - 1) {
        say join "\t", $uri, $length, join '/', @path[ 0 .. $length ];
    }
}

您可以使用split函数提取您需要的信息

use strict;
use warnings;
my $name = '/aaa/bbb/ccc?eee=true&fff=false';
my @val = split(/\?/,$name);
my @parts =split(/\//,$val[0]);
print "@parts\n";

现在您可以根据需要从 @parts 数组中获取数据。

输出:

aaa bbb ccc

这将按照您的要求进行。它使用 URI 模块,并从每个 URL 字符串构建一个对象,以便可以使用方便的方法来操作内容

首先使用 $url->query(undef) 删除查询。然后路径被分成 @path 中的段列表,并且该列表被截断为所需的长度

结果转回字符串返回

程序从您作为示例给出的每个 URL 中提取一段、两段和三段路径

use strict;
use warnings 'all';
use feature 'say';

use URI;

my $url1 = '/aaa/bbb/ccc/ddd/eee';
my $url2 = '/aaa/bbb/ccc?eee=true&fff=false';

for my $url ( $url1, $url2 ) {
    print trim_path($url, $_), "\n" for 1 .. 5;
    print "\n";
}

sub trim_path {
    my ($url, $n) = @_;
    $url = URI->new($url);

    $url->query(undef);

    my @path = $url->path_segments;
    $url->path_segments( @path[0..$n] ) if $n < $#path;

    return "$url";
}

输出

/aaa
/aaa/bbb
/aaa/bbb/ccc
/aaa/bbb/ccc/ddd
/aaa/bbb/ccc/ddd/eee

/aaa
/aaa/bbb
/aaa/bbb/ccc
/aaa/bbb/ccc
/aaa/bbb/ccc