Ikegami 是对的,你真的应该至少使用一个 HTML/XML 解析器来完成这项任务。我个人喜欢使用Mojo::DOM
解析器。这是您的 HTML 的文档对象模型接口,它支持CSS3 选择器,使其在您需要时非常灵活。然而,这对它来说非常简单:
#!/usr/bin/env perl
use strict;
use warnings;
use Mojo::DOM;
my $content = <<'END';
<html>
<head> <title> Example </title> </head>
<style>
p{color: red;
background-color: #FFFF;
}
div {......
...
}
</style>
<body>
<p> hi I'm a paragraph. </p>
</body>
</html>
END
my $dom = Mojo::DOM->new( $content );
$dom->find('style')->pluck('remove');
print $dom;
该pluck
方法有点令人困惑,但它实际上只是对每个结果对象执行方法的简写。类似的线可以是
$dom->find('style')->each(sub{ $_->remove });
这更容易理解但不那么可爱。
在阅读您的编辑后,您必须处理的不仅仅是您的基本表单,我必须进一步强调这就是为什么您使用解析器来修改 HTML 而不是让您的正则表达式增长到荒谬的比例。
现在让我们说$content
变量也包含这些行
<link rel="stylesheet" type="text/css" href="$url_path/gridsorting.css">
<link rel="icon" href="somefile.jpg">
您要删除第一个而不是第二个的位置。您可以通过以下两种方式之一执行此操作。
$dom->find('link')->each( sub{ $_->remove if $_->{rel} eq 'stylesheet' } );
此机制使用对象方法(并且 Mojo::DOM 将属性公开为哈希键)来仅删除link
具有rel=stylesheet
. 但是,您可以仅对find
这些元素使用 CSS3 选择器,并且由于 Mojo::DOM 具有完整的 CSS3 选择器支持,您可以这样做
$dom->find('link[rel=stylesheet]')->pluck('remove');
CSS3 选择器语句可以用逗号连接以查找与任一选择器匹配的所有标签,因此我们可以简单地包含该行
$dom->find('style, link[rel=stylesheet]')->pluck('remove');
并一举摆脱所有令人反感的样式表!