Почему это регулярное выражение не совпадает? - PullRequest
0 голосов
/ 15 марта 2011

У меня есть Perl-скрипт из веб-прокси Squid:

#!/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 ]

1 голос
/ 15 марта 2011

Почему бы не использовать модуль синтаксического анализа URI ? Вот простой пример с его использованием. Таким образом, вы можете выбрать хост с помощью простого $uri->host() и сравнить его со списком хостов. Вы также должны иметь возможность получать поля itag и id независимо от того, в каком порядке они находятся, или если есть и другие атрибуты, которые могут нарушить регулярное выражение.

1 голос
/ 15 марта 2011

Я бы порекомендовал разделить регулярное выражение на отдельные переменные, а затем модифицировать одно из них за раз. Таким образом, вы можете найти проблему самостоятельно.

Я не уверен, что кто-то потрудится отладить вашу программу. Пример:

 my $part1 =qr/http:\/\/([0-9.]{4}/;
 my $part2 = qr/.*\.youtube\.com/;
 #etc ... then
 if (m/^part1|$part2....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...