Perl楽しいから好き

Perlをはじめとしたプログラミング周りのあれこれについて。モダーンなPerlを楽しんでいます。

Perlの正規表現を使って、HTMLの中にあるJavascript部分を取り除いてみた。

HTMLの中のコンテンツ部分だけ抽出したい、という欲望がムクムクと湧いてきたのでPerl正規表現で書いてみました。これまでも、HTMLタグを取り除く処理は書いたことあるんですが、「欲張りでない量指定子」(Non-Greedy Matches)が理解できてなかったので、Javascriptの中身が残ってしまうといった失敗をしていました。『初めてのPerl』(リャマ本)7章~9章を読み直して、だいぶ理解できた気がする。

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use feature qw/say/;
use Encode qw/encode/;

my $html;

while(<DATA>){
    chomp;
    $html .= $_;
}

# javascript部分を除去
$html =~ s#<script.*?>.*?</script>##gis;

# Windowsコマンドプロンプトに出力するのでCP932にエンコード
say encode('cp932', $html);

__DATA__
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Perlの正規表現、ステキやん。</title>
<meta charset="utf-8">
<meta name="description" content="Perlの正規表現は強力です。文字列処理がはかどりまくり。">
<meta name="author" content="kamiokan">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="">
<!--[if lt IE 9]>
<script src="//cdn.jsdelivr.net/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<link rel="shortcut icon" href="">
</head>
<body>
コンテンツ部分。

Perlの正規表現は強力です:)
<script src="./hoge.js" type="text/javascript"></script>

<script>
 Javascript...
</script>

<!--
<script>
 Javascript...
</script>
-->

<script type="text/javascript">
 Javascript...
</script>

</body>
</html>

↑よく目にするHTML内のJavascriptの記述を数パターン用意してあります。ごく稀にですが、Javascript部分のタグを「SCRIPT」という風に大文字で書く猛者がいるので、/i修飾子を付けてあります。

<!DOCTYPE html><html><head><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>Perlの正規表現、ステキやん。</title><meta charset="utf-8"><meta name="descri
ption" content="Perlの正規表現は強力です。文字列処理がはかどりまくり。"><meta name="author" content="kamiokan"><meta name="viewport" content="width=device-width, i
nitial-scale=1"><link rel="stylesheet" href=""><!--[if lt IE 9]><![endif]--><link rel="shortcut icon" href=""></head><body>コンテンツ部分。Perlの正規表現は強力です
:)<!----></body></html>

↑結果はこんな感じです。Javascript部分が綺麗に取り除けました。

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use feature qw/say/;
use Encode qw/encode/;

my $html;

while(<DATA>){
    chomp;
    $html .= $_;
}

# コメント部分も除去
$html =~ s#<!--.*?-->##gs;

# javascript部分を除去
$html =~ s#<script.*?>.*?</script>##gis;

# htmlタグも除去
$html =~ s#</?.*?>##gs;

# Windowsコマンドプロンプトに出力するのでCP932にエンコード
say encode('cp932', $html);

__DATA__
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Perlの正規表現、ステキやん。</title>
<meta charset="utf-8">
<meta name="description" content="Perlの正規表現は強力です。文字列処理がはかどりまくり。">
<meta name="author" content="kamiokan">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="">
<!--[if lt IE 9]>
<script src="//cdn.jsdelivr.net/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<link rel="shortcut icon" href="">
</head>
<body>
コンテンツ部分。

Perlの正規表現は強力です:)
<script src="./hoge.js" type="text/javascript"></script>

<script>
 Javascript...
</script>

<!--
<script>
 Javascript...
</script>
-->

<script type="text/javascript">
 Javascript...
</script>

</body>
</html>

↑せっかくなので、HTMLタグとかも除去します。

Perlの正規表現、ステキやん。コンテンツ部分。Perlの正規表現は強力です:)

↑結果はコチラ。コンテンツだけキレイに抜き取ることができました。


Perlは本当に手軽で便利だから好きです。