2009-10-22 27 views
1

我在自學Perl,我通過示例學得最好。因此,我正在研究一個簡單的Perl腳本,它會刮掉一個特定的博客,並發現自己對一些正則表達式感到困惑。該腳本查找HTML以下塊:我是Perl新手,有幾個正則表達式問題

<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. 如何做下面的行工作:

    ([^>] *)#職銜

  3. 什麼的 「六個一」 指的是在下面一行:

    </DD >/six)

非常感謝您的幫助!我現在也在研究自己的問題的答案,但希望有人能給我一個提升!

+0

帖子標題位看起來應該是'([^ <] *)' – ysth 2009-10-22 06:22:56

+0

我知道你是Perl新手,但'六個'是什麼意思?讓我想起那個簡化sinx/cosx到/ co – EmFi 2009-10-22 06:30:07

+4

的都市傳奇人物請認識到這是一個不好的例子。 HTML不是一種常規語言,因此正則表達式不是解析它的好工具。 – Svante 2009-10-22 07:02:59

回答

7

如何以下行工作...

([^ 「] *)#錨名

零個或更多的東西不屬於」 捕獲爲$ 1,$ 2 ,或什麼的,這取決於支架數量(在我們。

如何做以下行工作...

([^ >] *)#發帖標題

零個或多個不是>,被捕獲爲$ 1,$ 2或其他任何東西。

什麼 「六」 是指在以下 線...

</DD>/6)

  • S =匹配爲單線(這只是裝置那麼「。」匹配所有內容,包括\ n,否則它不會這樣做)
  • i =忽略大小寫不敏感
  • x =忽略空白在正則表達式。

x還能夠把意見變成正則表達式本身,所以像# Post title的東西有剛剛意見。

請參閱perldoc perlre瞭解更多/更好的信息。該鏈接適用於Perl 5.10。如果您沒有Perl 5.10,則應該查看Perl版本的perlre文檔。

+0

非常感謝你! – BeachRunnerFred 2009-10-22 06:22:04

+1

「匹配爲單行」並不是很有用。/s的意思。匹配任何字符,包括換行符,而不是除了換行符之外的默認任何字符。 – ysth 2009-10-22 06:24:08

+0

@ysth:我改變了你的建議。 – 2009-10-22 06:31:30

1
  1. 該代碼是一個擴展正則表達式。它允許你在你的正則表達式中輸入空格和註釋。參見perldoc perlreperlretut。否則像正常。

  2. 相同。

  3. 字符是regex modifiers
2
  1. [^"]*的意思是「不包含引號零個或多個字符的字符串」。這是由形成引用字符串的引號括起來的,其類型如下<a name=
  2. [^>]*與上面類似,它表示任何不包含>的字符串。請注意,您可能的意思是[^<],以匹配下一個標籤的開頭<,不包括實際開放。
  3. 這是一個PHP特定的正則表達式標誌的集合。我知道i表示不區分大小寫,其餘部分不確定。
+0

re:#3 - 不,它不是PHP特有的。它們是PCRE正則表達式庫使用的標誌,可用於許多不同的語言。有關PCRE的完整詳細信息,請參見http://www.pcre.org/pcre.txt上的文檔。 (PCRE = Perl兼容正則表達式) – 2009-10-22 09:37:42

+0

無論如何,我仍然不知道他們都是什麼意思:) – Blindy 2009-10-22 14:54:48