将具有特定ID的HTML表单包装在新标记中



我有一个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不是一个选项。

放下正则表达式,获得专为该目的设计的东西。例如Mojo::DOM。

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

假设这是一个简单的文本处理可以完成的特定任务。如果你还有更多的事情要做,我建议你使用合适的包装。

至关重要的是,html forms不能嵌套,因此您可以搜索您的一对表单标记。

如果你能把整个页面读入字符串

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

如果页面太大,无法读入变量,请逐行阅读,并使用标记(带有)表单的开始和结束标记。如果需要添加,请告诉我。

最新更新