Многострочное регулярное выражение
Я пытаюсь найти соответствие из этого текста:
<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>(.*)