1

次の URL を書き換える正規表現を提案できますか。

http://intranet/myApp/index.cfm/go:welcome.home/fruit:orange/car:ford/age:37/music:rock

これに:

http://intranet/myApp/index.cfm?go=welcome.home&fruit=orange&car=ford&age=37&music=rock

異なる定義の任意の数の URL パラメータに対応できる必要があります。

現在、私は最初の url パラメータまでの一致/置換のみを管理しています。

    <rule>
        <from>/index\.cfm/go:([^:/]*){1}</from>
        <to>/index.cfm?go=$1</to>
    </rule>

":" を "=" に、"/" を "&" に置き換えて、それらが存在する場所に追加できるかどうかはわかりません。

ありがとう

4

2 に答える 2

1

補間を超えて「to」にコードを含めることができない場合はできません。ただし、そうするルールをたくさん生成することもできます。

my $MAX_ARGS = 20;
my ($p, $q);
for (1..$MAX_ARGS) {
    $p .= sprintf('/([^:/]+){%d}:([^/]*){%d}', $_+0, $_+1);
    $q .= sprintf('&$%d=$%d',                  $_+0, $_+1);
    $q =~ s/^&/?/;
    print <<"__EOI__";
    <rule>
        <from>/index\.cfm$p</from>
        <to>/index.cfm?$q</to>
    </rule>
__EOI__
}
于 2013-01-05T00:37:41.227 に答える
1

HTML の解析と同様に、URI の操作は、非常に多くの特殊なケースとフォーマットの複雑さを処理するライブラリを使用して行う方が適切です。この場合、非常に一般的なURI ライブラリを使用して URI を分離し、再びまとめます。

#!/usr/bin/env perl

use strict;
use warnings;

use Test::More;

use URI;

sub path_to_query_string {
    my $uri  = shift;
    my $file = shift;

    # Turn it into a URI object if it isn't already.
    $uri = URI->new($uri) unless eval { $uri->isa("URI"); };

    # Get the path all split up.
    my @path_pairs = $uri->path_segments;

    # Strip everything up to what is the real filename.
    my @path;
    while(@path_pairs) {
        push @path, shift @path_pairs;
        last if $path[-1] eq $file;
    }

    # Put the path bits back.
    $uri->path_segments(@path);

    # Split each key/value pair
    my @pairs;
    for my $pair (@path_pairs) {
        push @pairs, split /:/, $pair;
    }

    # Put them back on the URI
    $uri->query_form(\@pairs);

    return $uri;
}

my %test_urls = (
    "http://intranet/myApp/index.cfm/go:welcome.home/fruit:orange/car:ford/age:37/music:rock" =>
      "http://intranet/myApp/index.cfm?go=welcome.home&fruit=orange&car=ford&age=37&music=rock"
);

for my $have (keys %test_urls) {
    my $want = $test_urls{$have};
    is path_to_query_string($have, "index.cfm"), $want, "path_to_query_string($have)";
}

done_testing;
于 2013-01-05T01:41:24.543 に答える