質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

4039閲覧

phpのHTMLをエスケープ処理する関数

singlestroke

総合スコア68

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2016/03/21 07:53

php にて、HTMLをエスケープ処理する関数として下記のようなものがありました。

php

1function h($var) { 2 if ( is_array($var) ) { 3 return array_map( 'h', $var ); 4 } else { 5 return htmlspecialchars( $var, ENT_QUOTES, 'UTF-8' ); 6 } 7}

毎度、「htmlspecialchars( $var, ENT_QUOTES, 'UTF-8' )」を記述することが短縮できるということは理解できるのですが、その前の部分の

php

1 if ( is_array($var) ) { 2 return array_map( 'h', $var ); 3 }

は何をしているのでしょうか。$varが配列だった場合には、、、???よくわかりませんので教えていただけますと幸いです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

これはPHPのマニュアルを覗いたらわかる内容ではありますが、
is_array
array_map

結論から言うと、配列で渡されたものをすべてh関数を適用して戻す。


is_arrayで渡された変数が配列かどうか確認し、次のarray_mapに渡されています。
array_mapの仕様を確認すると、コールバック関数を"h"としています。
つまり、この質問のh関数自身ですね。

それにarray_mapの第2引数で$varの配列情報(is_arrayで配列と判断されたため)を渡しています。
これによりarray_map内部では、配列の要素は1つ1つ分解され、h関数を呼ぶようになっているわけです。

h関数を配列ではない変数を引数として呼び出されたものは、配列ではないので2つ目の処理htmlspecialchars側に処理が変わります。

したがって、配列だろうと、ただの変数だろうといずれにしてもhtmlspecialcharsを呼ぶようにする
という仕様のようですね。ちょっとは便利か。

追記 一応確認用のコードです:

php

1<?php 2 3function h( $var ) { 4 if ( is_array( $var ) ) { 5 return array_map( 'h', $var ); 6 } else { 7 return htmlspecialchars( $var , ENT_QUOTES, 'utf-8' ); 8 } 9} 10 11// --- 必要データ準備 12$arrayvar = array( 13 "1" => "<h>配列</h>", 14 "2" => "<input type='text' value='配列2'>配列2", 15 "3" => "<script language='javascript'>alert('test');</script>", 16 "4" => "" 17); 18 19$avar = "<b>test</b>"; 20// ----------------------------------------------------- 21 22// --- 確認 23echo "配列:" . "\n"; 24var_dump( h( $arrayvar ) ); 25 26echo "変数:" . "\n"; 27var_dump( h( $avar ) ); 28 29echo "ただの値:" . "\n"; 30var_dump(h ( "<h1>test</h1>" ) ); 31

投稿2016/03/21 08:12

編集2016/03/21 08:51
lib

総合スコア446

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

はい、array_map()関数を使っていますね。
$varが配列だった場合、配列内の要素を1つずつ取り出して、function h ()を実行させてから$var配列に戻して、全部終わったらそれをreturnする。
こういったことをやっています。

array_map関数は、第2引数で指定された配列の全要素に対して、第1引数に指定された関数を1個ずつ実行させるという機能があります。「コールバック関数」と、公式ドキュメントでは呼んでいますね。
http://php.net/manual/ja/function.array-map.php

php

1return array_map( 'h', $var );

第一引数に指定する関数ですが、'h'と、一見ただの文字データに見えますが、これは関数名を表しています。

今回の場合だと、function h 関数ですね。
$varが配列だった場合、要素を1個取り出してそれを引数にしてh関数を実行させます。
そうすると、取り出した値が文字列だったら、そのままhtmlspecialcharasが実行されて値が返ってきますね。
仮に、取り出した要素がさらに配列だった場合でも、array_map()によってさらにその要素が取得されて・・・といった感じでどんどんループしていきます。

こうすることによって、f()関数はたとえ引数に文字列ではなく配列を渡した場合でも、その全ての値をHTMLエスケープすることが可能になっているということです。

配列の要素1つ1つを、foreachなどで展開させてからエスケープするのは手間ですから、大分省略できますね。

投稿2016/03/21 08:12

Iya712

総合スコア158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

singlestroke

2016/03/21 12:49

ループしているということが分かりました。ありがとうございます。
guest

0

再帰という技法です
自分自身を呼び再度処理して貰うことです

投稿2016/03/21 11:17

JinwonKim

総合スコア312

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問