0

「n」個のhtmlファイルを含む1つのフォルダーがあります。ファイルを読み込んで 1 行を取得します。(つまり) <img />1 つの配列でタグを取得し、配列を出力します。配列を印刷しなくなりました。手伝って頂けますか。私のコードはここにあります。

use strict;
use File::Basename;
use File::Path;
use File::Copy;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';

print "Welcome to PERL program\n";

#print "\n\tProcessing...\n";
my $foldername = $ARGV[0];
opendir(DIR,$foldername) or die("Cannot open the input folder for reading\n");
my (@htmlfiles) = grep/\.html?$/i, readdir(DIR);
closedir(DIR);


@htmlfiles = grep!/(?:index|chapdesc|listdesc|listreview|addform|addform_all|pattern)\.html?$/i,@htmlfiles;
# print "HTML file is @htmlfiles";

my %fileimages;
my $search_for = 'img';
my $htmlstr;
for my $files (@htmlfiles)
{
    if(-e "$foldername\\$files")
    {
        open(HTML, "$foldername\\$files") or die("Cannot open the html files '$files' for reading");
        local undef $/;my $htmlstr=<HTML>;
        close(HTML);
        $fileimages{uc($2)}=[$1,$files] while($htmlstr =~/<img id="([^"]*)" src="\.\/images\/[^t][^\/<>]*\/([^\.]+\.jpg)"/gi);

    }
}

コマンドプロンプトで。

perl findtext.pl "C:\viji\htmlfiles"

よろしく、ヴィジ

4

1 に答える 1

4

正規表現を使用して HTML を解析することは無駄であることを指摘したいと思います。答えについては叙事詩https://stackoverflow.com/a/1732454/1521179を参照してください。

画像タグを抽出するための正規表現はかなり壊れています。HTML パーサーを使用してツリーをたどる代わりに、…</p>

/<img id="([^"]*)" src="\.\/images\/[^t][^\/<>]*\/([^\.]+\.jpg)"/gi
  • から始まる<img
  • ちょうど 1 つのスペースの後に、シーケンスid="が見つかります。その属性のコンテンツが見つかった場合はキャプチャされ、見つからない場合は一致が失敗します。クロージング"が消費されます。
  • ちょうど 1 つのスペースの後、シーケンスsrc="./images/が見つかり、
  • ではない文字が続きtます。(もちろん、これは可能です")。
  • これに、スラッシュまたは文字ではない任意の数の任意の文字続き<>ます (これにより"、再び , が許可されます)。
  • スラッシュが続きます。
  • これをキャプチャします:
    • ドットではない 1 つ以上の文字
    • 接尾辞が続く.jpg
  • その後、"すぐに従わなければなりません。

偽陽性

正規表現が一致するはずのないデータを次に示します。

<ImG id="" src="./ImAgEs/s" alt="foo/bar.jpg"

それで、あなたが得るイメージパスは何ですか?./ImAgEs/s" alt="foo/bar.jpgあなたが望んでいたものではないかもしれません。

<!-- <iMg id="" src="./images/./foobar.jpg" -->

おっと、コメントされたコンテンツに一致しました。また、パスには のサブフォルダーが含まれていません./images。フォルダーは.正規表現で完全に有効ですが、同じフォルダーを示します。..HTML ファイルのフォルダとなる を使用することもできます。または./images/./t-rex/image.jpg、禁止されたtフォルダーに一致するものを使用できます。

偽陰性

以下は、必要なデータですが、取得できないデータです。

<img
  id="you-cant-catch-me"
  src='./images/x/awesome.jpg' />

なんで?改行—ただし、パラメーター間には単一のスペースのみを許可します。また、一重引用符は使用できません'

<img src="./images/x/awesome.jpg" id="you-cant-catch-me" />

なんで?私は今、単一のスペースを持っていますが、引数を交換しました。ただし、これらのフラグメントはどちらもまったく同じ DOM を示しているため、同等と見なす必要があります。

結論

http://www.cpan.org/にアクセスして、HTMLおよびを検索しTreeます。モジュールを使用して HTML を解析し、ツリーをたどって、一致するすべてのノードを抽出します。

printまた、どこかにステートメントを追加します。私は見つけた

 use Data::Dumper;
 print Dumper \%fileimages;

デバッグ目的には非常に啓発的です。

于 2012-09-21T09:08:30.070 に答える