对于示例数据中的简单锚标记,这个 Perl 脚本就足够了:
#!/usr/bin/env perl
use strict;
use warnings;
my @urls = ();
while (<>)
{
chomp;
if (m/\s*(<a\s+[^>]+>.*<\/a>)\s*/)
{
push @urls, $1;
s///;
}
print "$_\n";
}
foreach my $url (@urls)
{
print "$url\n";
}
示例输出:
<tr style="background-color: #EFEFEF">
<td valign="top">Line1<br />2013.05.23</td>
<td>Line2
<br />
<br />Line3
</td>
</tr>
<a href="link.html">link</a>
请注意,如果输入中的单行上有多个锚标记,它还将包括脚本底部外部标记之间的材料。如果锚标记跨行断开,它将被忽略。我毫不怀疑有 HTML 符号可以破坏这个脚本(但我不确定它们是什么)。
这是简单脚本的一小步:
#!/usr/bin/env perl
use strict;
use warnings;
my @urls = ();
while (<>)
{
chomp;
while (m/\s*(<a\s+[^>]+>.*?<\/a>)\s*/)
{
push @urls, $1;
s// /;
}
print "$_\n";
}
foreach my $url (@urls)
{
print "$url\n";
}
while
代替循环的循环if
遍历一行中的匹配项。非贪婪.*?
量词意味着它不会吞噬中间锚标签。替代品将删除的材料替换为空白,从而使分隔锚标签的单词保持分离。
示例数据:
<tr style="background-color: #EFEFEF">
<td valign="top">Line1<br />2013.05.23</td>
<td>Line2
<br /><a href="link.html">link</a>
<br />Line3
</td>
</tr>
<tr style="background-color: #EFEFEF">
<td valign="top">Line1<br />2013.05.23</td>
<td>Line2
<br /> <a href="link2.html">link</a> extraneous material <a href="link3.html">link</a> other notes <a href="link4.html">link</a>
<br />Line3
</td>
</tr>
示例输出:
<tr style="background-color: #EFEFEF">
<td valign="top">Line1<br />2013.05.23</td>
<td>Line2
<br />
<br />Line3
</td>
</tr>
<tr style="background-color: #EFEFEF">
<td valign="top">Line1<br />2013.05.23</td>
<td>Line2
<br /> extraneous material other notes
<br />Line3
</td>
</tr>
<a href="link.html">link</a>
<a href="link2.html">link</a>
<a href="link3.html">link</a>
<a href="link4.html">link</a>
您可以判断这是否足以满足您的目的。至少它给了你一些工作。