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

时间:2018-06-23 02:27:48

标签: regex perl

我是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" ;

4 个答案:

答案 0 :(得分:1)

尽管您可以摆脱使用正则表达式进行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();

Some more examples

答案 1 :(得分:1)

use Web::Query::LibXML 'wq';
my $w = wq <<'HTML';
<html><body>
<table>
(aaa)
</table>

<table>
xyz
</table>
HTML
$w->find('table:not(:contains("xyz"))')->html('');
print $w->as_html;

答案 2 :(得分:0)

per_process_gpu_memory_fraction=0.0001包含字符串@find(其中\n(aaa)\n是换行符)。调用\n时,您不匹配,因为$data =~ s/$_//中的括号字符是正则表达式元字符。 $_不匹配并替换字符串$data =~ s/\n(aaa)\n//;它与字符串\n(aaa)\n匹配,并返回字符串\naaa\n作为捕获组(例如,在特殊变量aaa中)。

Perl提供了两种机制来匹配正则表达式中的文字字符串。一种是将字符串包装在$1\Q标签中(有时是可选的):

\E

第二种方法是在应用正则表达式之前使用quotemeta函数。

$data =~ s/\Q$_\E//;           # match literal contents of $_

答案 3 :(得分:0)

CREATE TABLE dbo.all_tickers(
  ticker_symbol varchar(32) NOT NULL,
  [Date] datetime2(7) NOT NULL,
  [Open] float NULL,
  High float NULL,
  Low float NULL,
  [close] float NULL,
  Volume float NULL,
  PRIMARY KEY (ticker_symbol, [Date])
);
GO

DECLARE @Path nvarchar(255) = 'D:\ASX';
DECLARE @SQL nvarchar(MAX);
CREATE TABLE #ticker_staging(
  [Date] datetime2(7) NOT NULL,
  [Open] float NULL,
  High float NULL,
  Low float NULL,
  [close] float NULL,
  Volume float NULL
  );

SET @SQL = (SELECT N'
TRUNCATE TABLE #ticker_staging;
BULK INSERT #ticker_staging
    FROM ''' + @Path + N'\' + ticker + N'.csv''
    WITH
    (
    FIRSTROW = 2,
    FIELDTERMINATOR = '','',  --CSV field delimiter
    ROWTERMINATOR = ''\n'',   --Use to shift the control to next row
    TABLOCK
    );
INSERT INTO dbo.all_tickers WITH (TABLOCKX)(
  ticker_symbol,
  [Date],
  [Open],
  High,
  Low,
  [close],
  Volume
) 
SELECT
  ''' + ticker + N''',
  [Date],
  [Open],
  High,
  Low,
  [close],
  Volume
FROM #ticker_staging;'
FROM dbo.symbols
FOR XML PATH(''), TYPE).value('.',N'nvarchar(MAX)');
EXECUTE sp_executesql @SQL;
GO

...但是如果您在

中有一个
,那将不起作用。如果需要,请进行真正的HTML解析。