Perl - HTML のチェック・編集 - HTML の要素を編集(タグを変更)

クラウディア 
1. 概要
2. タグを変更する

1. 概要

 詳しい説明は省きます。

<span class="vi">・・・</span>
 もしくは

<pre class="vi">・・・</pre>
 と書いてある箇所を

<b>・・・</b>
 に書き換えるのです。

2. タグを変更する


#!/usr/local/bin/perl

use strict;
use FileList;

use constant true  => 1;
use constant false => 0;
use constant ext => 'html';

sub main
{
	my @argv = @_;
	my $root = $argv[0];

	if ($root !~ /\/$/)											#	末尾が / でない場合は
	{
		$root .= '/';											#	/ を付与する
	}

	my $list = FileList->new();

	my $filelist = $list->get($root, ext);

	foreach my $name (sort(@$filelist))
	{
		my $result = check($name);

		if ($result == true)
		{
			print "$name \n";
		}
	}
}

sub check
{
	my ($name) = @_;
	my $fh = IO::File->new();

	$fh->open($name, "r") or die "$!";							#	読込オープン
	my @read = <$fh>;										#	読込
	$fh->close();												#	クローズ

	my $change = false;
	my @write = undef;

	foreach my $line(@read)
	{
		#	<span class="mono">・・・</span>	を含む文字がある間

		while ($line =~ /(.*)(<span class="mono">.*<\/span>)(.*\n)/)
		{
			#	置き換え続ける

			$line =~ s/(.*)(<span class="mono">)(.*)(<\/span>)(.*\n)/$1<b>$3<\/b>$5/;
			$change = true;
		}

		push(@write, $line);
	}

	if ($change == true)
	{
		$fh->open($name, "w") or die "$!";
		print $fh @write;
		$fh->close();
	}

	return $change;
}

main(@ARGV);
 use lib は省略してあります。  FileList に関しては「クラスライブラリ」をご参照ください。  <pre class="vi">・・・</pre> の方は複数行にわたっているため変換を断念しました。  <span class="vi">・・・</span> の文字列が1行に収まっていなければならないという制約がありますが動きます。  複数回の変換を while でなく1行で表現できればよかったのですが、頭が回りませんでした。

perl ソースファイル.pl ディレクトリ
 で動作します。
earthcar(アースカー)