注意

概要

  • 入力された文字列などの中のHTMLとして直接記述できない文字をエスケープする。

ソースコード

#!/usr/bin/perl
# HTML用にエスケープ処理を行う。

use strict;
use warnings;
use utf8;
use Encode;
use HTML::Entities qw( encode_entities );

my $test = 'He said, "<em>Enjoy & Exciting!</em>."';

my @subs = ( 
	[ 'htmlEscapeN',		\&htmlEscapeN, ], 
	[ 'htmlEscapeE',		\&htmlEscapeE, ], 
	[ 'encode_entities',	\&encode_entities, ], 
);

printf( "Test:\n%s\n\n", $test );
foreach my $s ( @subs ){
	printf( "%s:\n%s\n\n", $s->[0], &{$s->[1]}($test) );
}

exit;

# 数値文字参照(16進)に変換
sub htmlEscapeN {
	my( $str ) = @_;
	$str =~ s/([&<>"'])/sprintf( "&#x%02X;", ord( $1 ) )/egmos;
	return $str;
}

# 文字実体参照に変換
# http://blog.livedoor.jp/dankogai/archives/50940023.html
sub htmlEscapeE {
	my $str = shift or return;
	my %escaped = ( '&' => 'amp', '<' => 'lt', '>' => 'gt', '"' => 'quot' );
	my $cclass2escape = '[' . join('', keys %escaped) . ']';
	$str =~ s{(${cclass2escape})(?!amp;)}{'&' . $escaped{$1} . ';'}msxgeo;
	return $str;
}

# EOF

出力

Test:
He said, "<em>Enjoy & Exciting!</em>."

htmlEscapeN:
He said, &#x22;&#x3C;em&#x3E;Enjoy &#x26; Exciting!&#x3C;/em&#x3E;.&#x22;

htmlEscapeE:
He said, &quot;&lt;em&gt;Enjoy &amp; Exciting!&lt;/em&gt;.&quot;

encode_entities:
He said, &quot;&lt;em&gt;Enjoy &amp; Exciting!&lt;/em&gt;.&quot;

ユニコード(サロゲートペア)をHTML数値参照へエスケープ

sub escapeSurrogatePair {
    my ($str) = @_;
    $str =~ s/([^\x{0000}-\x{ffff}])/sprintf( "&#x%x;", ord( $1 ) )/egmos;
    return $str;
}

Link