注意
- HTML のエスケープには encode_entities を使いましょう。(CPAN:HTML-Parser/lib/HTML/Entities.pm)
- URI のエスケープには uri_escape を使いましょう。(CPAN:URI/URI/Escape.pm)
- 正規表現をエスケープする時は quotemeta 。(perldoc.jp:func/quotemeta)
- SQL は自分でエスケープせず、プレースホルダと bind を使いましょう。
概要
- 入力された文字列などの中の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, "<em>Enjoy & Exciting!</em>."
htmlEscapeE:
He said, "<em>Enjoy & Exciting!</em>."
encode_entities:
He said, "<em>Enjoy & Exciting!</em>."
ユニコード(サロゲートペア)をHTML数値参照へエスケープ
sub escapeSurrogatePair {
my ($str) = @_;
$str =~ s/([^\x{0000}-\x{ffff}])/sprintf( "&#x%x;", ord( $1 ) )/egmos;
return $str;
}
Link
- CPAN:URI/URI/Escape.pm
- CPAN:String-Util trim, htmlesc, jsquote
- CPAN:Unicode-Escape \uXXXX 形式のエスケープ