Многострочное регулярное выражение

Я пытаюсь найти соответствие из этого текста:

<a href="http://english317.ning.com/profiles/blogs/bad-business-writing-487">Continue</a>
                                      </div>
                <p class="small">

                                                    Added by <a href="/profile/KemberleyRamirez">Kemberley Ramirez</a> on September 2, 2010 at 11:38pm   

Я хотел бы получить текст после /blogs (например, "bad-business-writing-487"), а также добавленный по строке (имя студента и дата подачи) (например, "Kemberley Ramirez" 2 сентября 2010 г. в 23:38 ")

Я использую UltraEdit с выражениями Perl.

4 ответа

Решение

Я не знаю, что именно вы пытаетесь сопоставить, но вам лучше использовать правильный HTML-парсер:

#!/usr/bin/perl

use strict; use warnings;

use HTML::TokeParser::Simple;

my $parser = HTML::TokeParser::Simple->new(\*DATA);

my $blog_re = qr{^http://english317.ning.com/profiles/blogs/(.+)\z};
my $profile_re = qr{^/profile/(\w+)\z};

while ( my $tag = $parser->get_tag('a') ) {
    next unless my ($href) = $tag->get_attr('href');
    if ( $href =~ $blog_re or $href =~ $profile_re ) {
        print "[$1]\n";
    }
}

__DATA__
<a href="http://english317.ning.com/profiles/blogs/bad-business-writing-487">Continue</a>
                                      </div>
                <p class="small">

                                                    Added by <a href="/profile/KemberleyRamirez">Kemberley Ramirez</a> on September 2, 2010 at 11:38pm

Используя PowerGrep в режиме "точка соответствует новой строке", я придумал это:

(?>profiles/blogs/(.*?)").*?added by(.*?)</a>(.*?2010.*?\d{2}[ap]m)

(а затем дополнительный поиск обработки) <? А.*?>

Модификаторы /s и /m управляют обработкой нескольких строк. см Perlretut

Вы, вероятно, хотите что-то вроде rrr reg.exps с модификатором /s, или что-то вроде этого: (не проверено)

$foo =~ m|blogs/([^"]+).*Added by <[^>]+>([^<]+)</a>|s

Используя m|| вместо // чтобы избежать всего ускользнувшего..

Следующее должно работать для нескольких строк:

.*blogs\/(\S+)".*\(\n.*\)*<a.*>(.*)<\/a>(.*)
Другие вопросы по тегам