2011-03-15 138 views
0

我從魷魚Web代理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程序員,所以我錯了?

+3

必須有一個模塊來更容易(更準確地)解析URLS。但那不是重點。你確定你的網址是你所在行的第二個字段嗎?因爲'$ _ = $ X [1];'。 – Benoit 2011-03-15 08:35:40

+0

的確,「URI」模塊 - 即使你不使用它,將匹配分成幾個階段可能是一個好主意,這可以追蹤不匹配的原因。 – reinierpost 2011-03-15 09:04:20

回答

1

我會建議將正則表達式分爲不同的變量,然後一次修改其中的一個。這樣你可以自己找到問題。

我不確定是否有人會打擾調試你的程序。 例子:

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

爲什麼不使用URI parser module?這裏是一個simple example使用一個。這樣你可以通過一個簡單的$uri->host()來抓住主機,並根據你的主機列表進行檢查。您也應該能夠獲得itagid字段,而不管它們的順序如何,或者還有其他屬性,這可能會破壞正則表達式。

+0

我不是perl程序員:P,那個腳本,就是我嘗試設置我的魷魚服務器來緩存youtube動態內容時遇到的事情。 – secmask 2011-03-15 08:51:33

+0

是否意味着您無法編輯腳本? – 2011-03-15 17:13:51

相關問題