如何获取两个字符串之间的字符串

How to get strings inbetween two Strings

我有一组 html 文件,我必须在其中提取 <hr></hr> 之间的内容 tags.I 除了这个 extraction.What 我有完成

1.Loaded 所有 html 个文件并将其存储在 @html_files.

2.Then 我将每个文件的内容存储在 @useful_files 数组中。

3.Then 我正在循环 @useful_files 数组并检查 <hr> 所在的每一行 found.If 发现我需要 @elements 数组中的下一行内容.

是possible.Am我在右边吗?

 foreach(@html_files){
 $single_file = $_;
 $elemets = ();
 open $fh, '<', $dir.'/'.$single_file or die "Could not open '$single_file' $!\n";
@useful_files = ();
@useful_files = <$fh>;
foreach(@useful_files){
    $line = $_;
    chomp($line);
    if($line =~ /<hr>/){
        @elements = $line;
    }
}
create(@elements,$single_file)
}

谢谢!!!

我的输入 html 文件将是这样的

<HR  SIZE="3" style="COLOR:#999999" WIDTH="100%" ALIGN="CENTER">
<P STYLE="margin-top:0px;margin-bottom:0px; text-indent:4%"><FONT STYLE="font-family:Times New Roman" SIZE="2">Lorem ipsum dolor sit amet, consectetur adipiscing elit.  </FONT></P> 
<P STYLE="font-size:12px;margin-top:0px;margin-bottom:0px">&nbsp;</P>
<TABLE CELLSPACING="0" CELLPADDING="0" WIDTH="100%" BORDER="0"  STYLE="BORDER-COLLAPSE:COLLAPSE">
<TR>
<TD WIDTH="45%"></TD>
<TD VALIGN="bottom" WIDTH="1%"></TD>
<TD WIDTH="4%"></TD>
<TD VALIGN="bottom"></TD>
<TD WIDTH="4%"></TD>
<TD VALIGN="bottom" WIDTH="1%"></TD>
<TD WIDTH="44%"></TD></TR>
<TR>
<TD VALIGN="top"></TD>
<TD VALIGN="bottom"><FONT SIZE="1">&nbsp;</FONT></TD>
<TD VALIGN="bottom"></TD>
<TD VALIGN="bottom"><FONT SIZE="1">&nbsp;</FONT></TD>
<TD VALIGN="bottom"><FONT STYLE="font-family:Times New Roman" SIZE="2">Title:</FONT></TD>
<TD VALIGN="bottom"><FONT SIZE="1">&nbsp;</FONT></TD>
<TD VALIGN="bottom"><FONT STYLE="font-family:Times New Roman" SIZE="2">John</FONT></TD></TR>
</TABLE>

<p Style='page-break-before:always'>
<HR  SIZE="3" style="COLOR:#999999" WIDTH="100%" ALIGN="CENTER">

我在此处复制的 html 代码只是 sample.I 需要 @elements 数组中 <hr> 之间的确切内容。

我知道有人说不要用正则表达式解析 HTML,但这似乎是一种相对简单的任务,需要使用正则表达式。

试试这个:

if ($line =~ m/<hr>(.*?)<\/hr>/){
    push @elements, ; 
}

这将提取 <hr></hr> 之间的文本,并将其存储在 @elements 数组的下一个索引中。

此外,您应该始终在代码顶部添加 use strict;use warnings;!这将阻止您犯愚蠢的错误,并防止以后出现许多不必要的麻烦。

在将文件内容提取到 @useful_files 数组后,您还应该关闭文件! close $fh;

(附带说明,这个数组的名称具有误导性。我建议您将其命名为 @lines@file_contents 之类的名称,因为它包含单个文件的内容...不是您的变量名称所暗示的多个文件。)

最简单的方法是:

my @cont;
foreach (@ARGV) {
  open my $fh,'<',$_;
  push @cont,join('',map { chomp; $_ } <$fh>)=~m%<hr>(.*?)</hr>%g;
}
#print join("\n",@cont,'');

是的,不用担心:所有文件都将在退出时关闭 "automagically" :)

提示:取消注释打印语句以查看结果。

您可以在命令行中使用 grep:

grep -Pzo '<hr>\K((.|\n)*)(?=</hr>)' file.html

这将允许您提取 <hr></hr> 之间的任何内容,即使存在新行也是如此。

示例:

tiago@dell:/tmp$ grep -Pzo '<hr>\K((.|\n)*)(?=</hr>)' <<< '<hr>a b c d </hr>'
a b c d 
tiago@dell:/tmp$ grep -Pzo '<hr>\K((.|\n)*)(?=</hr>)' <<< $'<hr>a b\nc d </hr>'
a b
c d

当然,您可以 运行 grep 多个文件。