Почему оператор матча не сопоставляет что-либо? - PullRequest
1 голос
/ 02 ноября 2009

Я пытаюсь разобрать этот блок HTML:

<div class="v120WrapperInner"><a href="/redirect?q=http%3A%2F%2Fwww.google.com%2Faclk%3Fsa%3DL%26ai%3DCKJh--O7tSsCVIKeyoQTwiYmRA5SnrIsB1szYhg2d2J_EAhABIJ7rxQ4oA1CLk676B2DJntmGyKOQGcgBAaoEFk_Qyu5ipY7edN5ETLuchKUCHbY4SA#0%26num%3D1%26sig%3DAGiWqtwtAf8NslosN7AuHb7qC7RviHVg7A%26q%3Dhttp%3A%2F%2Fwww.youtube.com%2Fwatch%253Fv%253D91sYT_8CN8Q%2526feature%253Dpyv%2526ad%253D3409309746%2526kw%253Dsusan%25252#0boyle&amp;adtype=pyv&amp;event=ad&amp;usg=bR7ErKA_3szWtQMGe2lt1dpxzHc=" title="The Valley Downs Chicago"><img class="vimg120" alt="The Valley Downs Chicago" src="http://i2.ytimg.com/vi/91sYT_8CN8Q/1.jpg">

для захвата ссылки перенаправления:

/redirect?q=http%3A%2F%2Fwww.google.com%2Faclk%3Fsa%3DL%26ai%3DCKJh--O7tSsCVIKeyoQTwiYmRA5SnrIsB1szYhg2d2J_EAhABIJ7rxQ4oA1CLk676B2DJntmGyKOQGcgBAaoEFk_Qyu5ipY7edN5ETLuchKUCHbY4SA#0%26num%3D1%26sig%3DAGiWqtwtAf8NslosN7AuHb7qC7RviHVg7A%26q%3Dhttp%3A%2F%2Fwww.youtube.com%2Fwatch%253Fv%253D91sYT_8CN8Q%2526feature%253Dpyv%2526ad%253D3409309746%2526kw%253Dsusan%25252#0boyle&amp;adtype=pyv&amp;event=ad&amp;usg=bR7ErKA_3szWtQMGe2lt1dpxzHc=

и название видео:

The Valley Downs Chicago

Когда я использую этот простой код Perl:

foreach $_ (@promotedVideos)
{
   if (/\s<div class="v120WrapperInner"><a href="([^"]*)" title="([^"]*)"><img/six)
   {
     print $1;
     print $2;
   }
}

ничего не печатает. Пока я устранял это, я подумал, что спрошу у экспертов, если вы видите что-то не так или проблематично. Заранее большое спасибо за вашу помощь!

Ответы [ 4 ]

7 голосов
/ 02 ноября 2009

Ваш модификатор / x regex что-то путает с пробелами. Удалить его.

То есть должно быть

if (/\s<div class="v120WrapperInner"><a href="([^"]*)" title="([^"]*)"><img/si)

/ x заставляет perl игнорировать пробелы в регулярном выражении, делая ваше регулярное выражение эквивалентным следующему:

/\s<divclass="v120WrapperInner"><a href="([^"]*)"title="([^"]*)"><img/six

что не будет совпадать.

Также это в начале может затормозить вещи.

Это код, который я использовал для тестирования:

use strict;


my $inp = '<div class="v120WrapperInner"><a href="/redirect?q=http%3A%2F%2Fwww.google.com%2Faclk%3Fsa%3DL%26ai%3DCKJh--O7tSsCVIKeyoQTwiYmRA5SnrIsB1szYhg2d2J_EAhABIJ7rxQ4oA1CLk676B2DJntmGyKOQGcgBAaoEFk_Qyu5ipY7edN5ETLuchKUCHbY4SA#0%26num%3D1%26sig%3DAGiWqtwtAf8NslosN7AuHb7qC7RviHVg7A%26q%3Dhttp%3A%2F%2Fwww.youtube.com%2Fwatch%253Fv%253D91sYT_8CN8Q%2526feature%253Dpyv%2526ad%253D3409309746%2526kw%253Dsusan%25252#0boyle&amp;adtype=pyv&amp;event=ad&amp;usg=bR7ErKA_3szWtQMGe2lt1dpxzHc=" title="The Valley Downs Chicago"><img class="vimg120" alt="The Valley Downs Chicago" src="http://i2.ytimg.com/vi/91sYT_8CN8Q/1.jpg">';

print "$inp\n";

if ( $inp =~ /<div class="v120WrapperInner"><a href="([^"]*)" title="([^"]*)"><img/si )
{
 print "m:\n$1\n$2\n";
}
3 голосов
/ 02 ноября 2009

Хорошо, это не совсем то, что вы спрашиваете, но я думаю (основываясь на этом и вашем старом вопросе), что вы анализируете HTML.

Позвольте мне сказать вам следующее: регулярные выражения не являются решением. Вы должны использовать HTML :: TreeBuilder для анализа документов HTML, потому что документы HTML ужасно грязные.

#!/usr/bin/perl
use strict;
use warnings;
use HTML::TreeBuilder;

my $root = HTML::TreeBuilder->new_from_file(\*DATA);
foreach my $div ($root->find_by_tag_name('div')) {
    if ($div->attr('class') eq 'v120WrapperInner') {
        foreach (my $a = $div->find_by_tag_name('a')) {
            print "m:\n", $a->attr('href'), "\n", $a->attr('title'), "\n";
        }
    }
}
2 голосов
/ 02 ноября 2009

Хорошо, что вы получаете опыт использования регулярных выражений в perl, но для такого типа работы вы можете рассмотреть возможность использования синтаксического анализатора DOM, например XML :: DOM .

0 голосов
/ 02 ноября 2009

G'day,

Если у вас возникли проблемы с пониманием регулярных выражений, могу ли я прочитать вступительное слово регулярного выражения в превосходной книге Дейла Догерти "sed & awk" ( очищенная ссылка Amazon ).

Определенно одно из лучших вступлений для регулярного выражения.

НТН

ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...