【问题标题】:Extracting part of a URL提取部分 URL
【发布时间】:2016-07-13 16:51:25
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您能否解释一下您的/aaa/bbb 部分。看起来问题中存在一些问题。

标签: regex perl uri


【解决方案1】:

这将按照您的要求进行。它使用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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我想引用'URI'-&gt;new($string) 中的课程在某种程度上是防御性的?它的目的是什么?
    • @Borodin:是的,当存在这样的子例程时,它可以保护您免受 Perl 解析器将 URI-&gt;new 解释为 URI()-&gt;new 的影响。它仍然不能保护您免受裸字文件句柄URI(如open URI, '&lt;', $file)的影响,您需要使用URI::-&gt;new,但我觉得它太难用了。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-21
      • 2013-07-15
      • 2018-09-20
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      相关资源
      最近更新 更多