为什么这个正则表达式不匹配?

时间:2011-03-15 08:30:10

标签: regex perl

我有一个来自Squid网络代理的Perl脚本:

#!/usr/bin/perl
$|=1;
while (<>) {
    @X = split;
    $x = $X[0];
    $_ = $X[1];
    if (m/^http:\/\/([0-9.]{4}|.*\.youtube\.com|.*\.googlevideo\.com|.*\.video\.google\.com).*?\&(itag=22).*?\&(id=[a-zA-Z0-9]*)/) {
        print $x . "http://video-srv.youtube.com.SQUIDINTERNAL/" . $2 . "&" . $3 . "\n";
    # youtube Normal screen always HD itag 35, Normal screen never HD itag 34, itag=18 <--normal?
    } elsif (m/^http:\/\/([0-9.]{4}|.*\.youtube\.com|.*\.googlevideo\.com|.*\.video\.google\.com).*?\&(itag=[0-9]*).*?\&(id=[a-zA-Z0-9]*)/) {
        print $x . "http://video-srv.youtube.com.SQUIDINTERNAL/" . $2 . "&" . $3 . "\n";

    } else {
        print $x . $_ . "\n";
    }
}

我是从http://wiki.squid-cache.org/ConfigExamples/DynamicContent/YouTube获得的。 我测试了输入,如

http://v24.lscache6.c.youtube.com/videoplayback?sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor%2Coc%3AU0hPRVFUTl9FSkNOOV9JTlJF&fexp=905230%2C901013&algorithm=throttle-factor&itag=34&ipbits=0&burst=40&sver=3&signature=2A5088FD4F64CF9D58A5B798E14452D71B51BAE8.2EABF06D09C8C81650266C5464CF1D0B4D6C25CC&expire=1300190400&key=yt1&ip=0.0.0.0&factor=1.25&id=e838f2cd3549e3cb
在RegexBuddy中使用Perl语法

,我发现它与上面脚本中的第二个正则表达式匹配。但是当我运行脚本时,它并不匹配。我不是Perl程序员,所以我哪里错了?

2 个答案:

答案 0 :(得分:1)

我建议将正则表达式分成单独的变量,然后一次修改其中一个。这样你就可以自己找到问题。

我不确定是否有人会费心去调试你的程序。 例如:

 my $part1 =qr/http:\/\/([0-9.]{4}/;
 my $part2 = qr/.*\.youtube\.com/;
 #etc ... then
 if (m/^part1|$part2....

答案 1 :(得分:1)

为什么不使用URI parser module?这是一个使用simple example的{{3}}。这样,您可以通过简单的$uri->host()抓取主机,并根据您的主机列表进行检查。您也应该能够获得itagid字段,无论它们处于什么顺序,或者是否还有其他属性,这可能会破坏正则表达式。