提取 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
我使用正则表达式将 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