特殊文字のエスケープ

注意

概要

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

ソースコード

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
!
 
 
 
 
-
|
|
|
!
 
 
 
-
|
|
|
!
 
!
|
|
#!/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数値参照へエスケープ

すべてを展開すべてを収束
  1
  2
  3
  4
  5
-
|
|
|
!
sub escapeSurrogatePair {
    my ($str) = @_;
    $str =~ s/([^\x{0000}-\x{ffff}])/sprintf( "&#x%x;", ord( $1 ) )/egmos;
    return $str;
}

リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Mon, 26 Sep 2016 17:44:40 JST (479d)