2011-06-23 23 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'引用单引号或双引号。由于它是正则表达式的一部分,所以在数字前面需要反斜杠,而不是美元符号。