+ -
当前位置:首页 → 问答吧 → Perl正则匹配URL问题

Perl正则匹配URL问题

时间:2010-09-14

来源:互联网

http://www.xxxxxx.com/j/?event_code=interview&e_cat=itvw&e_cd=1&uid=2826770&send_date=2010-09-14&url=www.xxxxxx.com/member/autologon.jsp?auth_str=db1a+mzkzuos18tagthz+wbtvztiede88tk7mrx3vicxsp6h&url=job.xxxxxx.com/job/apply

http://www.xxxxxx.com/verify?code=ebacDljUtT6Wr+f33c3QidXjp0IphoccT6GvOHEakrQ0Fh3+FdttwPhFpDM4IZVGgfoQK1POZ0jB&e_cat=VERI&uid=2835562&e_cd=default&[email protected]&send_date=2010-09-14

这是两行URL地址;
我想匹配:
$1 —> e_cat
$2 —> e_cat= 后面的直
$3 —> e_cd 或 uid
$4 —> e_cd 或 uid = 后面的值
$5 —> send_date 或 email
$6 —> send_date 或 email 后面的值
$7 —> url 或 send_date
$8 —> url 或 send_date 后面的值
规则就是把&符号后面的一组值打印出来;
如:
e_cat  itvw   e_cd  1            uid     2826770  send_date  2010-09-14              url              www.xxxxxx.com
e_cat  VERI  uid    2835562  e_cd  default     email          [email protected]  send_date  2010-09-14

作者: LMUser   发布时间: 2010-09-14

本帖最后由 珞水的大叔 于 2010-09-14 14:12 编辑

楼主,你的需求和结果不一样啊
需求是8个,结果却是10个

暂且当是要10个结果吧,并且假如知道该位置的项的名称范围及顺序,则代码如下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $lala = 'http://www.xxxxxx.com/j/?event_code=interview&e_cat=itvw&e_cd=1&uid=2826770&send_date=2010-09-14&url=www.xxxxxx.com/member/autologon.jsp?auth_str=db1a+mzkzuos18tagthz+wbtvztiede88tk7mrx3vicxsp6h&url=job.xxxxxx.com/job/apply';
  5. my $lele = 'http://www.xxxxxx.com/verify?code=ebacDljUtT6Wr+f33c3QidXjp0IphoccT6GvOHEakrQ0Fh3+FdttwPhFpDM4IZVGgfoQK1POZ0jB&e_cat=VERI&uid=2835562&e_cd=default&[email protected]&send_date=2010-09-14';
  6. my $regex = qr{&(e_cat)=([^=&]+)
  7.                .*?
  8.                &(e_cd|uid)=([^=&]+)
  9.                .*?
  10.                &(e_cd|uid)=([^=&]+)
  11.                .*?
  12.                &(send_date|email)=([^=&]+)
  13.                .*?
  14.                &(url|send_date)=([^=&/]+)
  15.                }xi;

  16. my @result;
  17. @result= $lala =~ /$regex/g;
  18. print "$_\t" for @result;
  19. print "\n";

  20. @result = $lele =~ /$regex/g;
  21. print "$_\t" for @result;
  22. print "\n";
复制代码
结果如下:
  1. e_cat        itvw        e_cd        1        uid        2826770        send_date        2010-09-14        url        www.xxxxxx.com       
  2. e_cat        VERI        uid        2835562        e_cd        default        email        [email protected]        send_date        2010-09-14       
复制代码

作者: 珞水的大叔   发布时间: 2010-09-14

split /&/,$url;
或者:
@match = $a=~/&([^&]+)/gi;

作者: wfnh   发布时间: 2010-09-14

嘿嘿,看来我的写法最复杂啊,不符合perl的美学

作者: 珞水的大叔   发布时间: 2010-09-14



QUOTE:
嘿嘿,看来我的写法最复杂啊,不符合perl的美学
珞水的大叔 发表于 2010-09-14 14:11


正则应该尽量少用|

作者: wfnh   发布时间: 2010-09-14

这个……为什么呢
是因为效率么

作者: 珞水的大叔   发布时间: 2010-09-14

回复 珞水的大叔

是的···

作者: wfnh   发布时间: 2010-09-14

  1. use strict;
  2. use warnings;

  3. my ( @arr, @new, $name, $temp );
  4. while ( <DATA> ) {
  5.         @arr = split /&/,$_;
  6.         shift @arr;
  7.         foreach $name ( @arr ) {
  8.                 @new = split /=/,$name;
  9.                 if ( $new[1] =~ /\// ) {
  10.                         $temp = (split /\//,$new[1])[0];
  11.                         printf ("%-12s %-12s\n",$new[0],$temp);
  12.                 }
  13.                 else {
  14.                         foreach (0..$#new ) {
  15.                                 printf ( "%-12s",$new[$_] );
  16.                                 print "\n" if ( $_ % 2 );
  17.                         }
  18.                 }
  19.         }
  20. }


  21. __DATA__

  22. http://www.xxxxxx.com/j/?event_code=interview&e_cat=itvw&e_cd=1&uid=2826770&send_date=2010-09-14&url=www.xxxxxx.com/member/autologon.jsp?auth_str=db1a+mzkzuos18tagthz+wbtvztiede88tk7mrx3vicxsp6h&url=job.xxxxxx.com/job/apply

  23. http://www.xxxxxx.com/verify?code=ebacDljUtT6Wr+f33c3QidXjp0IphoccT6GvOHEakrQ0Fh3+FdttwPhFpDM4IZVGgfoQK1POZ0jB&e_cat=VERI&uid=2835562&e_cd=default&[email protected]&send_date=2010-09-14
复制代码

作者: shangat   发布时间: 2010-09-14