Regex Perl删除表标记之间的字符串

Regex Perl删除表标记之间的字符串,regex,perl,Regex,Perl,我是Perl新手,正在尝试在某些情况下从HTML文件中删除表 这里有一个例子。如果字符串不包含字符串xyz,我想删除表标记之间的字符串。但是代码不起作用,它不会删除第一个表。我应该如何修改代码以使其正常工作?非常感谢 这是我的密码: use strict; use warnings; use autodie; my $data = <<TEXT; <table> (aaa) </table> <table> xyz </table>

我是Perl新手,正在尝试在某些情况下从HTML文件中删除表

这里有一个例子。如果字符串不包含字符串xyz,我想删除表标记之间的字符串。但是代码不起作用,它不会删除第一个表。我应该如何修改代码以使其正常工作?非常感谢

这是我的密码:

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解析。