提取部分URL

时间:2016-07-13 16:51:26

标签: regex perl uri

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

例如,假设$2包含URI部分,URI可能有也可能没有查询参数,即格式为/aaa/bbb/ccc/ddd/eee/aaa/bbb/ccc?eee=true&fff=false

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

我遇到的问题是第三个斜杠之后的部分可能有也可能没有查询参数。

如果查询参数存在,如何忽略它们?

3 个答案:

答案 0 :(得分:1)

使用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 ];
    }
}

答案 1 :(得分:1)

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

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

结果将变回字符串并返回

该程序从您提供的每个网址中提取一段,两段和三段路径作为示例

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

答案 2 :(得分:-1)

您可以使用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