2010-09-03 4 views
-1

Я пытаюсь соответствовать из этого текста:Multi-Line Regular Expression

<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 

Я хотел бы получить текст после/блоги (например, «плохой бизнес-писание-487») и также добавлено строкой (имя студента и дата отправки) (например, «Кемберли Рамирес» 2 сентября 2010 года в 23:38 »)

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

+0

Вы могли бы найти этот сайт полезным:?.? Regexlib.com/ – vlood

+5

[Друзья не позволяют друзьям разбора HTML с регулярными выражениями.] (HTTP://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – Ether

+0

Я не спрашивал, должен ли я; Я спросил КАК. И это вполне осуществимо в этой ситуации с тем, что теги обычно находятся в одном и том же месте, чтобы анализировать его с помощью REGEX. – Caveatrob

ответ

3

Я не знаю, что именно вы пытаетесь соответствовать, но лучше использовать надлежащее 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 
-1

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

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

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

Использование м || вместо того, чтобы // избежать всех вытекание ..

-2

После должны работать на нескольких линиях:

.*blogs\/(\S+)".*\(\n.*\)*<a.*>(.*)<\/a>(.*) 
0

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

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

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