1

次のコードがあります。

#!/usr/bin/perl

use strict;
use warnings;

use URI qw( );

my @insert_words = qw( HELLO );

while (<DATA>) {
chomp;
my $url = URI->new($_);
my $path = $url->path();

for (@insert_words) {
  # Use package vars to communicate with /(?{})/ blocks.
  my $insert_word = $_;
  local our @paths;
  $path =~ m{
     ^(.*/)([^/]*)((?:/.*)?)\z
     (?{

        push @paths, "$1$insert_word$2$3";
        if (length($2)) {
           push @paths, "$1$insert_word$3";
           push @paths, "$1$2$insert_word$3";
        }
     })
     (?!)
  }x;

  for (@paths) {
     $url->path($_);
     print "$url\n";
    }
  }
}

__DATA__
http://www.bagandboxfactory.com/index.php?route=checkout/
http://www.stackoverflow.com/dog/cat/rabbit/
http://www.superuser.co.uk/dog/cat/rabbit/hamster/

現時点では、上記のコードは のstackoverflow and superuserURL に対して完全に機能し__DATA__ます。stackoverflowURLに対して次の出力が得られます。

http://www.stackoverflow.com/dog/cat/rabbit/HELLO
http://www.stackoverflow.com/dog/cat/HELLOrabbit/
http://www.stackoverflow.com/dog/cat/HELLO/
http://www.stackoverflow.com/dog/cat/rabbitHELLO/
http://www.stackoverflow.com/dog/HELLOcat/rabbit/
http://www.stackoverflow.com/dog/HELLO/rabbit/
http://www.stackoverflow.com/dog/catHELLO/rabbit/
http://www.stackoverflow.com/HELLOdog/cat/rabbit/
http://www.stackoverflow.com/HELLO/cat/rabbit/
http://www.stackoverflow.com/dogHELLO/cat/rabbit/

ご覧のとおりHELLO、スラッシュ (/) に遭遇すると、特定の場所に文字列が挿入されます。

私が抱えている問題:

URLに等号(=)が見つかったときに同じことが起こるようにしたい。

例として使用http://www.bagandboxfactory.com/index.php?route=checkoutすると、出力で次のようになります。

http://www.bagandboxfactory.com/index.php?route=HELLOcheckout/   <- puts HELLO before the string after the equals
http://www.bagandboxfactory.com/index.php?route=HELLO/   <- replaces the string after the equals with HELLO
http://www.bagandboxfactory.com/index.php?route=checkoutHELLO/  <- puts HELLO after the string that is after the equals

正規表現を

^(.*/)([^/]*)((?:/.*)?)\z

^(.*[/=])([^/=]*)((?:[/=].*)?)\z動作しますが、動作しません。

これを行うには、正規表現に何を変更する必要がありますか?

あなたの助けは大歓迎です、どうもありがとう

__更新_ _ _

複数のパラメーターを処理できる必要があります。たとえば、URL がある場合、http://www.example.com/dog/cat=2&foo=5取得する出力は次のようになります。

http://www.example.com/HELLOdog/cat=2&foo=5  
http://www.example.com/HELLO/cat=2&foo=5
http://www.example.com/dogHELLO/cat=2&foo=5
http://www.example.com/dog/cat=HELLO2&foo=5
http://www.example.com/dog/cat=HELLO&foo=5
http://www.example.com/dog/cat=2HELLO&foo=5
http://www.example.com/dog/cat=2&foo=HELLO5
http://www.example.com/dog/cat=2&foo=HELLO
http://www.example.com/dog/cat=2&foo=5HELLO

私がすでに持っているコードは正しく動作し、URL に含まれるすべてのスラッシュに対してこれを実行しますが=、URL に含まれる(または正規表現で指定することを選択した他の文字) ときにも実行する必要があります。例 [/=@-])。

4

1 に答える 1

1

正規表現エンジンを作動させてバックトラッキングを実行することは、巧妙な手法です。

主な問題は、クエスチョン マークの後の部分がクエリであり、 から入手できます$url->query$url->pathクエリなしでパス コンポーネントを返します。

コードを次のように変更する

#!/usr/bin/perl

use strict;
use warnings;

use URI qw( );

my @insert_words = qw( HELLO );

while (<DATA>) {
    chomp;
    my $url = URI->new($_);
    my $path = $url->path();
    my $query = $url->query;

    for (@insert_words) {
      # Use package vars to communicate with /(?{})/ blocks.
      my $insert_word = $_;
      local our @paths;
      $path =~ m{
         ^(.*/)([^/]*)((?:/.*)?)\z
         (?{
            push @paths, "$1$insert_word$2$3";
            if (length($2)) {
               push @paths, "$1$insert_word$3";
               push @paths, "$1$2$insert_word$3";
            }
         })
         (?!)
      }x;

      local our @queries;
      if (defined $query) {
          $query =~ m{
              ^(.*[/=])([^/=&]*)((?:[/=&].*)?)\z
              (?{
                  if (length $2) {
                      push @queries, "$1$insert_word$2$3";
                      push @queries, "$1$insert_word$3";
                      push @queries, "$1$2$insert_word$3";
                  }
              })
              (?!)
          }x;
      }

      for (@paths) {
          $url->path($_);

          if (@queries) {
              for (@queries) {
                  $url->query($_);
                  print $url, "\n";
              }
          }
          else {
              print $url, "\n";
          }
      }
    }
}

__DATA__
http://www.bagandboxfactory.com/index.php?route=checkout/
http://www.stackoverflow.com/dog/cat/rabbit/
http://www.superuser.co.uk/dog/cat/rabbit/hamster/
http://www.example.com/index.php?route=9&other=7/

次の出力が得られます。@insert_wordsクエリ置換のロジックは、クエリの末尾のスラッシュがある場合はその後にそれぞれを追加するため、わずかに異なります。

http://www.bagandboxfactory.com/HELLOindex.php?route=HELLOcheckout/
http://www.bagandboxfactory.com/HELLOindex.php?route=HELLO/
http://www.bagandboxfactory.com/HELLOindex.php?route=checkoutHELLO/
http://www.bagandboxfactory.com/HELLO?route=HELLOcheckout/
http://www.bagandboxfactory.com/HELLO?route=HELLO/
http://www.bagandboxfactory.com/HELLO?route=checkoutHELLO/
http://www.bagandboxfactory.com/index.phpHELLO?route=HELLOcheckout/
http://www.bagandboxfactory.com/index.phpHELLO?route=HELLO/
http://www.bagandboxfactory.com/index.phpHELLO?route=checkoutHELLO/
http://www.stackoverflow.com/dog/cat/rabbit/HELLO
http://www.stackoverflow.com/dog/cat/HELLOrabbit/
http://www.stackoverflow.com/dog/cat/HELLO/
http://www.stackoverflow.com/dog/cat/rabbitHELLO/
http://www.stackoverflow.com/dog/HELLOcat/rabbit/
http://www.stackoverflow.com/dog/HELLO/rabbit/
http://www.stackoverflow.com/dog/catHELLO/rabbit/
http://www.stackoverflow.com/HELLOdog/cat/rabbit/
http://www.stackoverflow.com/HELLO/cat/rabbit/
http://www.stackoverflow.com/dogHELLO/cat/rabbit/
http://www.superuser.co.uk/dog/cat/rabbit/hamster/HELLO
http://www.superuser.co.uk/dog/cat/rabbit/HELLOhamster/
http://www.superuser.co.uk/dog/cat/rabbit/HELLO/
http://www.superuser.co.uk/dog/cat/rabbit/hamsterHELLO/
http://www.superuser.co.uk/dog/cat/HELLOrabbit/hamster/
http://www.superuser.co.uk/dog/cat/HELLO/hamster/
http://www.superuser.co.uk/dog/cat/rabbitHELLO/hamster/
http://www.superuser.co.uk/dog/HELLOcat/rabbit/hamster/
http://www.superuser.co.uk/dog/HELLO/rabbit/hamster/
http://www.superuser.co.uk/dog/catHELLO/rabbit/hamster/
http://www.superuser.co.uk/HELLOdog/cat/rabbit/hamster/
http://www.superuser.co.uk/HELLO/cat/rabbit/hamster/
http://www.superuser.co.uk/dogHELLO/cat/rabbit/hamster/
http://www.example.com/HELLOindex.php?route=9&other=HELLO7/
http://www.example.com/HELLOindex.php?route=9&other=HELLO/
http://www.example.com/HELLOindex.php?route=9&other=7HELLO/
http://www.example.com/HELLOindex.php?route=HELLO9&other=7/
http://www.example.com/HELLOindex.php?route=HELLO&other=7/
http://www.example.com/HELLOindex.php?route=9HELLO&other=7/
http://www.example.com/HELLO?route=9&other=HELLO7/
http://www.example.com/HELLO?route=9&other=HELLO/
http://www.example.com/HELLO?route=9&other=7HELLO/
http://www.example.com/HELLO?route=HELLO9&other=7/
http://www.example.com/HELLO?route=HELLO&other=7/
http://www.example.com/HELLO?route=9HELLO&other=7/
http://www.example.com/index.phpHELLO?route=9&other=HELLO7/
http://www.example.com/index.phpHELLO?route=9&other=HELLO/
http://www.example.com/index.phpHELLO?route=9&other=7HELLO/
http://www.example.com/index.phpHELLO?route=HELLO9&other=7/
http://www.example.com/index.phpHELLO?route=HELLO&other=7/
http://www.example.com/index.phpHELLO?route=9HELLO&other=7/
于 2013-03-07T14:50:48.980 に答える