-1

我正在尝试匹配此文本:

<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 于 2010 年 9 月 2 日晚上 11:38 ")

我将 UltraEdit 与 Perl 表达式一起使用。

4

4 回答 4

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
于 2010-09-03T15:51:13.000 回答
0

在“点匹配换行符”模式下使用 PowerGrep,我想出了这个:

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

(然后是额外的处理搜索) <?a.*?>

于 2010-09-05T06:46:01.947 回答
-1

/s 和 /m 修饰符控制如何处理多行。见perlretut

您可能想要带有 /s 修饰符的 rrr reg.exps 之类的东西,或者类似这样的东西:(未经测试)

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

使用 m|| 而不是 // 避免所有转义 ..

于 2010-09-03T09:18:41.443 回答
-2

以下应该适用于多行:

.*blogs\/(\S+)".*\(\n.*\)*<a.*>(.*)<\/a>(.*)
于 2010-09-03T10:19:14.567 回答