我有一个文件夹,它包含'n'个html文件。我会读取文件并取一行。 (即)我将<img />
标记放在一个数组中并打印数组。现在不打印数组。你能帮助我吗。我的代码在这里。
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”
问候,viji
答案 0 :(得分:4)
我想指出用正则表达式解析HTML是徒劳的。请参阅史诗https://stackoverflow.com/a/1732454/1521179了解 答案。
提取图像标签的正则表达式非常破碎。您可以搜索字符串......而不是使用HTML解析器并遍历树。
/<img id="([^"]*)" src="\.\/images\/[^t][^\/<>]*\/([^\.]+\.jpg)"/gi
<img
id="
。如果找到该属性,则捕获该属性的内容,否则匹配失败。结束"
已被消耗。src="./images/
,t
的字符。 (当然,这允许"
。)<>
字符(这又允许"
),.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;
用于调试目的非常有启发性。