用新标签包裹表格

时间:2016-04-15 19:51:10

标签: perl search-and-promote

我有一个Perl脚本,可以解析HTML并修改内容。我想更新下面的脚本,在页面上的特定ID周围包含一个noindex标记。

相关Perl信息

undef $/;
my $doc = <>;

if ($main::atomz_search_url=~ m{mydomain.com/(.+?)/support}si) 
{
$doc =~ s{<div id="header">}{<div id="header" class="noindex">}sig;
}

当前HTML

<form id="search" action="../results.html" method="post">
  <fieldset>
        ...
  </fieldset>
</form>

我只是想找到ID为“search”的FORM,并用noindex标签包装整个FORM块(包括原始内容)。

<noindex>
 <form id="search" action="../results.html" method="post">
  <fieldset>
        ...
  </fieldset>
 </form>
</noindex>

注意:我只能使用核心模块,因此不能选择MOJO。

2 个答案:

答案 0 :(得分:2)

放下正则表达式并获得为此目的而设计的东西。例如Mojo :: DOM。

use Mojo::DOM;
my $dom = Mojo::DOM->new($doc);
$dom->at("#search")->wrap("<noindex></noindex>");
say $dom;

答案 1 :(得分:0)

鉴于这是一项特定的任务,一个简单的文本处理可能会这样做。 如果您还有更多工作要做,我建议您使用合适的包装。

html form无法嵌套至关重要,因此您可以搜索一对表单标记。

如果您可以将整个页面读成字符串

my $file = 'page_with_form.html';
my $page = do {
    local $/ = undef; 
    open my $fh, '<', $file or die $!; 
    <$fh>;
};
$page =~ s{(<form\s+id="search".+?</form>)}{<noindex>\n$1</noindex>}s;

如果页面太大而无法读入变量,请逐行阅读并使用标记(表示行)的开始和结束标记。如果我需要添加此内容,请与我们联系。