サンプル データの単純なアンカー タグの場合、次の 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>
入力の 1 行に複数のアンカー タグがある場合は、スクリプトの下部にある外側のタグの間にある素材も含まれることに注意してください。アンカー タグが複数の行にまたがっている場合、それは無視されます。このスクリプトを破る可能性のある 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>
これがあなたの目的にとって十分かどうかを判断することができます。少なくとも、取り組むべき何かを与えてくれます。