2011-06-23 27 views
3

,所以我有這樣的:初學perl的問題

for $i ([email protected]) { 
if ($parsedText[$i] =~ /\s{20}<a href/) { 

    my $eventID = $parsedText[$i]; 
    my $eventLink = $parsedText[$i]; 
    my $event_id_title = $parsedText[$i]; 

    $eventID =~ s/[\s\S]*?id=(\d+).*\n/$1/; 
    $eventLink =~ s/[\s\S]*?'(.*?)'.*/$1/; 
    $event_id_title =~ s/\s+<a[\s\S]*?>([^<]*).*\n/$1/; 
    }; 
}; 

但由於某些原因,如果我打印任何人,它返回原來的價值,而不是字符串替換,我想它返回。

感謝您的幫助

+2

您應該完成您的示例,向我們展示您的打印方式。這聽起來微不足道,在這種情況下,可能很重要。 –

+3

:O用正則表達式解析html的正面投票;無論如何,你的語法看起來是正確的,你確定你的正則表達式是正確的嗎?你的投入是什麼? – NorthGuard

+1

你的'for'循環應該寫成'我的$ i(0.. $#parsedText)'。你的例子會讀取結尾的一個元素。並同意格雷格,你需要發佈你如何打印數據。 –

回答

5

你得到同樣的作爲,因爲你比賽的第一部分不匹配,所以沒有替換正在做。

我的猜測是(因爲沒有輸入顯示)您的parsedText陣列中沒有換行符。下面是寫一個稍微乾淨的方式你上面做了什麼:

foreach (@parsedText) { 
    if (/\s{20}<a href/) { 

    (my $eventID = $_)  =~ s/.*?id=(\d+).*/$1/; 
    (my $eventLink = $_)  =~ s/.*?'(.*?)'.*/$1/; 
    (my $event_id_title = $_) =~ s/\s+<a.*?>(.*?)<.*/$1/; 

    print "$eventID, $eventLink, $event_id_title\n"; 
    } 
} 

一般來說,你應該避免解析HTML這樣,轉而使用多年收集的智慧是http://cpan.org和使用HTML解析器::,HTML: :Parser :: Simple或HTML :: TreeBuilder。

+2

+1:同意使用HTML: :Parser'等 –

+0

非常感謝,這是問題所在。我已經在新行分割字符串來創建一個數組,但是當寫正則表達式時立即忘了這個。另外,我會研究這些解析器......雖然我的基本理解對我來說可能有些困惑。所以期待更多的問題:P – Aelfhere

0

這工作...

my $eventID = $parsedText[$i]; 
my $eventLink = $parsedText[$i]; 
my $event_id_title = $parsedText[$i]; 

$eventID =~ s/.*id=['"]?(\d+)['"]?.*/$1/; 
$eventLink =~ s/^.+a\s+href\s*=\s*(['"])([^\1]+)\1.*/$2/; 
$event_id_title =~ s/\s+<a.*?>([^<]*).*/$1/; 

print "$eventID\n"; 
print "$eventLink\n"; 
print "$event_id_title\n"; 

正則表達式可能會非常棘手。最好你建立一個測試程序並對它們進行一點點測試,直到你得到你想要的。請記住,您可以在HTML中使用單引號或雙引號,並且該網址可以包含引號。而且,ID不一定是數字(儘管我保留在這裏)。

$eventLink中的'\ 1'引用單引號或雙引號。由於它是正則表達式的一部分,所以在數字前面需要反斜槓,而不是美元符號。