池上氏の言うとおり、このタスクを実行するには、少なくとも HTML/XML パーサーを使用する必要があります。Mojo::DOM
個人的にはパーサーを使うのが好きです。これは HTML への Document-Object Model インターフェースであり、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">
2番目ではなく最初のものを削除したい場所。これは、2 つの方法のいずれかで行うことができます。
$dom->find('link')->each( sub{ $_->remove if $_->{rel} eq 'stylesheet' } );
このメカニズムは、オブジェクト メソッド (および Mojo::DOM が属性をハッシュ キーとして公開する) を使用しlink
て、 rel=stylesheet
. ただし、これらの要素にのみ CSS3 セレクターを使用することはできますがfind
、Mojo::DOM には CSS3 セレクターが完全にサポートされているため、これを行うことができます。
$dom->find('link[rel=stylesheet]')->pluck('remove');
CSS3 セレクター ステートメントをカンマで結合して、いずれかのセレクターに一致するすべてのタグを検索できるため、単純に次の行を含めることができます。
$dom->find('style, link[rel=stylesheet]')->pluck('remove');
攻撃的なスタイルシートをすべて一挙に削除します!