Regex Perl删除表标记之间的字符串
我是Perl新手,正在尝试在某些情况下从HTML文件中删除表 这里有一个例子。如果字符串不包含字符串xyz,我想删除表标记之间的字符串。但是代码不起作用,它不会删除第一个表。我应该如何修改代码以使其正常工作?非常感谢 这是我的密码:Regex Perl删除表标记之间的字符串,regex,perl,Regex,Perl,我是Perl新手,正在尝试在某些情况下从HTML文件中删除表 这里有一个例子。如果字符串不包含字符串xyz,我想删除表标记之间的字符串。但是代码不起作用,它不会删除第一个表。我应该如何修改代码以使其正常工作?非常感谢 这是我的密码: use strict; use warnings; use autodie; my $data = <<TEXT; <table> (aaa) </table> <table> xyz </table>
use strict;
use warnings;
use autodie;
my $data = <<TEXT;
<table>
(aaa)
</table>
<table>
xyz
</table>
TEXT
my @find=();
@find=$data =~ m/<TABLE[^>]*>(.*?)<\/TABLE>/imosg;
foreach (@find) {
if ($_!~ m/xyz/imosg){$data =~ s/$_//;}
}
print "$data\n","*" x 40, "\n" ;
使用严格;
使用警告;
使用自动模具;
my$data=@find
包含字符串\n(aaa)\n
(其中\n
是换行符)。调用$data=~s/$\u/
时,不匹配,因为$\u
中的括号字符是regexp元字符$data=~s/\n(aaa)\n/
不匹配并替换字符串\n(aaa)\n
;它匹配字符串\naaa\n
,并将字符串aaa
作为捕获组返回(例如,在特殊变量$1
中)
Perl提供了两种机制来匹配正则表达式中的文本字符串。一种是将字符串包装在\Q
和(有时是可选的)\E
标记中:
$data =~ s/\Q$_\E//; # match literal contents of $_
第二种方法是在应用正则表达式之前使用函数
my $q = quotemeta($_);
$data =~ s/$q//;
@find
包含字符串\n(aaa)\n
(其中\n
是换行符)。调用$data=~s/$\u/
时,不匹配,因为$\u
中的括号字符是regexp元字符$data=~s/\n(aaa)\n/
不匹配并替换字符串\n(aaa)\n
;它匹配字符串\naaa\n
,并将字符串aaa
作为捕获组返回(例如,在特殊变量$1
中)
Perl提供了两种机制来匹配正则表达式中的文本字符串。一种是将字符串包装在\Q
和(有时是可选的)\E
标记中:
$data =~ s/\Q$_\E//; # match literal contents of $_
第二种方法是在应用正则表达式之前使用函数
my $q = quotemeta($_);
$data =~ s/$q//;
<>虽然您可以使用正则表达式来快速和肮脏地操作HTML,但您可能会考虑使用HTML解析器作为一种不易出错的方法。下面是一个例子:
#!/usr/bin/perl
use 5.012;
use strict;
use warnings;
use autodie;
use XML::LibXML;
my $html = <<'EOF';
<!DOCTYPE html>
<html>
<head>
<title>Test Document</title>
</head>
<body>
<table>
<thead>
<tr><th>Country</th><th>Population</th></tr>
</thead>
<tbody>
<tr><td>Lithuania</td><td>2,908,249</td></tr>
<tr><td>Bermuda</td><td>61,666</td></tr>
</tbody>
</table>
<table>
<thead>
<tr><th>Country</th><th>Population</th></tr>
</thead>
<tbody>
<tr><td>Botswana</td><td>2,250,260</td></tr>
<tr><td>Dominica</td><td>73,543</td></tr>
</tbody>
</table>
</body>
</html>
EOF
my $dom = XML::LibXML->load_html(
string => $html,
recover => 1,
);
foreach my $table ($dom->findnodes('//table')) {
my $text_content = $table->to_literal;
if($text_content =~ /botswana/i) {
$table->parentNode->removeChild($table);
}
}
say $dom->toStringHTML();
#/usr/bin/perl
使用5.012;
严格使用;
使用警告;
使用自动模具;
使用XML::LibXML;
my$html=$html,
恢复=>1,
);
foreach my$表($dom->findnodes('//table')){
我的$text\u content=$table->to\u literal;
如果($text\u content=~/botswana/i){
$table->parentNode->removeChild($table);
}
}
说出$dom->tostringtml();
尽管您可以使用正则表达式来快速和肮脏地操作HTML,但您可能会考虑使用HTML解析器作为一种不易出错的方法。下面是一个例子:
#!/usr/bin/perl
use 5.012;
use strict;
use warnings;
use autodie;
use XML::LibXML;
my $html = <<'EOF';
<!DOCTYPE html>
<html>
<head>
<title>Test Document</title>
</head>
<body>
<table>
<thead>
<tr><th>Country</th><th>Population</th></tr>
</thead>
<tbody>
<tr><td>Lithuania</td><td>2,908,249</td></tr>
<tr><td>Bermuda</td><td>61,666</td></tr>
</tbody>
</table>
<table>
<thead>
<tr><th>Country</th><th>Population</th></tr>
</thead>
<tbody>
<tr><td>Botswana</td><td>2,250,260</td></tr>
<tr><td>Dominica</td><td>73,543</td></tr>
</tbody>
</table>
</body>
</html>
EOF
my $dom = XML::LibXML->load_html(
string => $html,
recover => 1,
);
foreach my $table ($dom->findnodes('//table')) {
my $text_content = $table->to_literal;
if($text_content =~ /botswana/i) {
$table->parentNode->removeChild($table);
}
}
say $dom->toStringHTML();
#/usr/bin/perl
使用5.012;
严格使用;
使用警告;
使用自动模具;
使用XML::LibXML;
my$html=$html,
恢复=>1,
);
foreach my$表($dom->findnodes('//table')){
我的$text\u content=$table->to\u literal;
如果($text\u content=~/botswana/i){
$table->parentNode->removeChild($table);
}
}
说出$dom->tostringtml();
.使用Web::Query::LibXML'wq';
我的$w=wq html(“”);
打印$w->as_html;
使用Web::Query::LibXML'wq';
我的$w=wq html(“”);
打印$w->as_html;
$data=~s{()(.*)()}
{
我的($1,$2,$3)=($1,$2,$3);
$two=~/xyz/
“$1$2$3”
:“$1$3”
}esig;
…但如果你有一个内部的。如果需要,请执行真正的HTML解析。$data=~s{()(.*?)}
{
我的($1,$2,$3)=($1,$2,$3);
$two=~/xyz/
“$1$2$3”
:“$1$3”
}esig;
…但如果你有一个内部的。如果需要,请执行真正的HTML解析。regexp与解析的选择也取决于HTML的质量。脏输入有时需要脏方法(regexp)。公平地说,LibXML的HTML解析非常擅长处理低质量的HTML。非常感谢!我将研究Perl中的HTML解析。regexp与解析的选择也取决于HTML的质量。脏输入有时需要脏方法(regexp)。公平地说,LibXML的HTML解析非常擅长处理低质量的HTML。非常感谢!我将研究Perl中的HTML解析。如果没有语法,它将不起作用。也可以使用xyz
而不仅仅是xyz
。非常感谢您的建议!我会试试的。没有这个,它就不行。也可以使用xyz
而不仅仅是xyz
。非常感谢您的建议!我会试试的。非常感谢你的建议!我将研究使用Perl的HTML解析。非常感谢您的建议!我将使用Perl研究HTML解析。