アフィリエイト広告を利用しています
検索
<< 2024年11月 >>
          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
最新記事
タグクラウド
カテゴリーアーカイブ
ファン
最新コメント
プロフィール
ゼロから始めるシステム開発さんの画像
ゼロから始めるシステム開発
 こんにちは!ナビゲータのEVEです。各種研究室を用意し、次期EVEシステムを製造しようと日々頑張っています。現在一番力を入れているのが、資金調達です。このブログもその一環ですので、ご協力いただければ嬉しいです。
プロフィール

2024年11月21日

htmlspecialchars 〜プログラム研究室〜


 こんにちは!
 ナビゲータのEVEです。
プログラミング.jpg
 昨日までPHPの仕様について調べてきましたが、正直って、こんなコトするのは珍しいことです。普通は最初覚えた仕様で作っていきます。本日は、そういうことをしていると損をしてしまうという話です。

[htmlspecialchars]
 htmlspecialcharsは、PHP4.0に追加された関数です。htmlspecialcharsの仕様目的は、PHPの教本などを読んでいると、クロスサイドスクリプティング対策としていますが、実は他にもあります。それは、データベースへの登録です。
 現在のバージョンは不明ですが、以前のMySQLなどでは、htmlspecialcharsによりエスケープしていない文字列を登録しようとした場合、エラーになることがあります。そのため、ユーザーが入力するデータばかりではなく、実は、データベースに登録するすべてのデータはエスケープしなければなりませんでした。

[Knowlegeシステム]
 以前から、勉強した知識など、Prototype EVEKnowlegeシステムへ登録して、知識として残しているという話をしていますが、そのシステムでも、HTML画面から入力した情報を、必ず、htmlspecialcharsを使って、エスケープしています。ただ、知識として残そうとしているため、入力した情報をいろいろなタグを使用して表示したいというニーズがあります。
 ただ、HTMLをブログで使用しようとした人は知っていると思いますが、HTMLタグを<textarea>から入力したデータは実はきれいに表示することができません。そのため、Knowlegeシステムでは、きれいに表示できるように、独自タグを利用して、強引にきれいに見えるように変換しています。
 ただ、そこで困ったことが出てきます。タグを変換した文字列には、必ず&(アンバサンド)が入るのですが、何回か変換すると、&(アンバサンド)のampがどんどん増えていくのです。以下がその例です。

変換前→&
1回目の変換→&amp;
2回目の変換→&amp;&amp;
3回目の変換→&amp;&amp;&amp;
 ・
 ・
 ・
 ・


バグがあった場合などや、データベースの登録方法などにより、何回もhtmlspecialcharsが使用されると以上のようなことになり、&を表示したいだけなのに、全く違う文字列になってしまうということがあります。

[PHP5.0]

独習PHP/山田祥寛【3000円以上送料無料】

価格:3740円
(2024/11/21 17:24時点)
感想(0件)



 ただ、今回独習PHP第4版を読んで知ったのですが、PHP5.0からhtmlspecialcharsへある引数を設定することにより、特殊文字表記を崩さずに変換できるという機能が追加されました。以下が、構文です。

htmlspecialchars(string $string, int $flags = ENT_COMPAT, ?string $encoding = null, bool $double_encode = true): string


$string (string)
 エスケープしたい文字列を指定します。

$flags (int)
 オプションで、エスケープ処理の方法を指定します。デフォルトは ENT_COMPAT です。ENT_QUOTES や ENT_NOQUOTES など、異なるオプションが指定できます。

$encoding (?string)
 文字エンコーディングを指定します。指定しない場合、PHPのデフォルトエンコーディング(通常は UTF-8)が使用されます。null を渡すことも可能です。

$double_encode (bool)
 デフォルトは true です。true の場合、既にエスケープされた文字(例えば、&)も再エスケープします。false の場合は、再度エスケープしません。



以上の$double_encodeにfalseと指定すれば問題ないところを、実は、Knowlegeシステムでは、涙ぐましい努力をしています。独習PHP第4版を読んでいるとき、この機能を知っていれば、もっと楽ができたのにと、しみずみと感じてしまいました。
 但し、htmlspecialcharsで変換される、タグは以下の通りです。

& (アンパサンド) → &amp;
< (小なり) → &lt;
> (大なり) → &gt;
" (ダブルクオート) → &quot;
' (シングルクオート) → &#039; または &apos;(ただし、$flags によって異なる動作をする場合があります)



[あとがき]
 htmlspecialcharsで変換できる特殊文字は、以上5種類だという話をしましたが、実は文字表記としては、今日までの調べでは、252種類あります。
 252種類の文字表記すべてに&(アンバサンド)がついており、その対応は実は自分でしなければなりません。本日は、その対応に半日近く使ってしまいました。明日は、今日の続きと言うことでそのことを話しましょう!

 では、また!!!
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/12787737
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック