2010-09-03 4 views
-1

Je suis en train de faire correspondre de ce texte: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 

J'aimerais obtenir le texte après/blogs (par exemple "bad-écriture-entreprise 487") et aussi l'ajout par chaîne (Nom de l'étudiant et date de soumission) (par exemple "Kemberley Ramirez le 2 septembre 2010 à 23h38")

J'utilise UltraEdit avec des expressions Perl.

+0

Vous trouverez peut-être ce site utile:.? Regexlib.com/ – vlood

+5

[Les amis ne laissent pas des amis Parse HTML avec des expressions régulières.] (Http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – Ether

+0

Je n'ai pas demandé si je devais; J'ai demandé comment. Et c'est parfaitement faisable dans cette situation avec le fait que les tags sont systématiquement au même endroit pour l'analyser avec REGEX. – Caveatrob

Répondre

3

Je ne sais pas ce que vous essayez de faire correspondre exactement, mais vous feriez mieux d'utiliser un bon analyseur 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

Les modificateurs/s et/m contrôlent la gestion de plusieurs lignes. voir perlretut

Vous voulez probablement quelque chose comme reg.exps RRR avec le modificateur/s, ou quelque chose comme ceci: (non testé)

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

utilisant m || au lieu de // pour éviter tout Escaping ..

-2

devrait fonctionner pour plusieurs lignes:

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

en utilisant PowerGrep en mode "point correspond à saut de ligne", je suis venu avec ceci:

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

(et une recherche de traitement supplémentaire) < a *>