如何获取两个字符串之间的字符串
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"> </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"> </FONT></TD>
<TD VALIGN="bottom"></TD>
<TD VALIGN="bottom"><FONT SIZE="1"> </FONT></TD>
<TD VALIGN="bottom"><FONT STYLE="font-family:Times New Roman" SIZE="2">Title:</FONT></TD>
<TD VALIGN="bottom"><FONT SIZE="1"> </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 多个文件。
我有一组 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"> </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"> </FONT></TD>
<TD VALIGN="bottom"></TD>
<TD VALIGN="bottom"><FONT SIZE="1"> </FONT></TD>
<TD VALIGN="bottom"><FONT STYLE="font-family:Times New Roman" SIZE="2">Title:</FONT></TD>
<TD VALIGN="bottom"><FONT SIZE="1"> </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 多个文件。