问题描述
|
所以我有这个:
for $i (0..@parsedText) {
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/;
};
};
但是由于某种原因,如果我打印其中任何一个,它将返回原始值,而不是我希望返回的字符串替换。
谢谢你的帮助
解决方法
您得到的结果与出局的结果相同,因为匹配的第一部分不匹配,因此没有替换。
我的猜测是(由于未显示任何输入)您的
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 :: Parser,HTML :: Parser :: Simple或HTML :: TreeBuilder。
, 这有效...
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中使用单引号或双引号,并且URL可以在其中加上引号。而且,ID不必为数字(尽管我在这里将其保留为数字)。
$eventLink
中的\'\\ 1 \'引用单引号或双引号。由于它是正则表达式的一部分,因此您需要在数字前面加反斜杠,而不是美元符号。