我是Perl的新手并且有一些正则表达式问题

时间:2009-10-22 06:12:27

标签: html perl screen-scraping

我正在教自己Perl和我通过榜样学得最好。因此,我正在研究一个简单的Perl脚本,它擦除了一个特定的博客,并发现自己对几个正则表达式语句感到困惑。该脚本查找以下html块:

 <dt><a name="2004-10-25"><strong>October 25th</strong></a></dt>
 <dd>
   <p>
     [Content]
   </p>
 </dd>
 ... and so on.

这是我正在研究的示例脚本:

#!/usr/bin/perl -w

use strict;
use XML::RSS;
use LWP::Simple;
use HTML::Entities;

my $rss = new XML::RSS (version => '1.0');
my $url = "http://www.linux.org.uk/~telsa/Diary/diary.html";
my $page = get($url);

$rss->channel(title       => "The more accurate diary. Really.",
          link        => $url,
          description => "Telsa's diary of life with a hacker:" 
                 . " the current ramblings");

foreach (split ('<dt>', $page))
{
if (/<a\sname="
         ([^"]*)     # Anchor name
         ">
         <strong>
         ([^>]*)     # Post title
         <\/strong><\/a><\/dt>\s*<dd>
         (.*)        # Body of post
         <\/dd>/six)
{
    $rss->add_item(title       => $2,
               link        => "$url#$1",
                   description => encode_entities($3));
}
}

如果您有时间更好地帮助我理解,我的问题是:

  1. 以下行如何运作:

    ([^“] *)#锚名称

  2. 以下行如何运作:

    ([^>] *)#Post title

  3. “六”在以下行中的含义是什么:

    &LT; / DD&GT; / 6)

  4. 非常感谢您的帮助!我现在也正在研究自己问题的答案,但希望有人能给我一个推动力!

3 个答案:

答案 0 :(得分:7)

  

以下行如何运作......

     

([^“] *)#锚名称

零或多个不是“,被捕获为$ 1,$ 2或其他什么的东西,取决于括号的数量(我们是。

  

以下行如何运作......

     

([^>] *)#Post title

零个或多个不是&gt;的东西,被捕获为$ 1,$ 2或其他任何东西。

  

“六”是什么意思   以下行...

     

&LT; / DD&GT; / 6)

  • s =匹配为单行(这只是意味着“。”匹配所有内容,包括\ n,否则不会这样做)
  • i =匹配大小写不敏感
  • x =忽略正则表达式中的空格。

x也可以将注释放入正则表达式本身,因此# Post title之类的内容只是注释。

有关更多/更好的信息,请参阅perldoc perlre。该链接适用于Perl 5.10。如果你没有Perl 5.10,你应该查看你的Perl版本的perlre文档。

答案 1 :(得分:2)

  1. [^"]*表示“任何不包含引号的零个或多个字符的字符串”。这被引号包围,形成一个带引号的字符串,类似于<a name=
  2. [^>]*与上面类似,它表示任何不包含>的字符串。请注意,您可能需要[^<],以匹配下一个标记的开始<,不包括实际开放。
  3. 这是一个特定于php的regexp标志的集合。我知道i表示不区分大小写,不确定其余的。

答案 2 :(得分:1)

  1. 代码是扩展的正则表达式。它允许您在正则表达式中放置空格和注释。请参阅perldoc perlreperlretut。否则就像正常一样。

  2. 相同。

  3. 字符为regex modifiers