まとめてサニタイズする方法として下記のように書いてみました。
引数が配列でなければ問題ないのですが、配列だとこんなエラーが出ます。
Warning: array_map() expects parameter 1 to be a valid callback, function 'sanitize' not found or invalid function name in ファイル名
foreachでまわすのも考えましたが、できるならスマートにと思っているのですが
どうすれば再帰的な処理ができるでしょうか?
$valid = new Valid();
$array = array(
'あああ','いいい','ううう',
);
$valid->sanitize( $array );
class Valid{
public function sanitize( $str ){
if ( is_array( $str ) ) return array_map( 'sanitize', $str );
return str_replace( "\0", '', $str );
}
}
No.2ベストアンサー
- 回答日時:
オブジェクト内のメソッドを動的に指定するcallableは
array($this, 'sanitize')
です。
また、クラス内のメソッドを静的に指定するcallableは
array(__CLASS__, 'sanitize')
です。PHP5.3以降では
'Valid::sanitize'
のように書くことも出来ます。
なお、配列再帰処理でしたらarray_walk_recursiveを使うのが一番速いですよ。
http://php.net/manual/ja/function.array-walk-rec …
(5.3以降のみのクロージャを使用しています)
class Valid {
____
____public static function sanitize($input) {
________if (is_array($input)) {
____________array_walk_recursive($input, function(&$v) {
________________$v = str_replace("\0", '', $v);
____________});
________} else {
____________$input = str_replace("\0", '', $input);
________}
________return $input;
____}
____
}
(この指摘をすると質問の前提条件自体が崩れると思いますが)
そもそもNULLバイトを削除したところで安全対策になるかどうかというと疑問です。
現在のPHPの多くの関数はバイナリセーフなのでNULLバイトを含んでいても正しく処理できます。
それよりもUTF-8エンコーディングバリデーションの方が必要な気がします。
私はこんな感じで、リクエストを処理する部分にエンコーディングバリデーションも組み込んでいますね。
http://qiita.com/mpyw/items/c39b9ee695a5c2e74627
【preg_match関数でパターンにu修飾子をつけたとき】
不正エンコーディングが見つかった際、返り値は必ずFALSEになります
【preg_replace関数でパターンにu修飾子をつけたとき】
不正エンコーディングが見つかった際、返り値は必ずNULLになります
わかりやすい回答をありがとうございました。
5.2のサーバーなので以下のようにして動作させることができました。
if ( is_array( $value ) ) return array_map( array( $this, 'sanitize' ), $value );
NULLバイト削除以下は略しましたが文字コードの設定やスペースの削除など一通りの処理を行っています。
qiitaのソースも是非参考にさせていただきます!
No.1
- 回答日時:
sanitizeは普通の関数じゃなくて、メソッドなので、オブジェクトに対して -> 経由での呼び出ししか出来ません。
つまり、array_map の引数に渡せません。Validというクラスで何をしたいのかいまいちわかりません。クラスとオブジェクトについて、よく理解されてないのではないかと思います。
とりあえず動くようにすると、
$valid = new Valid();
$array = array(
"ああ\0あ","いいい","ううう",
);
debug_zval_dump($array);
$array = $valid->sanitize( $array );
debug_zval_dump($array);
class Valid{
public function sanitize($str){
return Valid::sanitizesub($str);
}
public static function sanitizesub( $str ){
if ( is_array( $str ) ) return array_map( "Valid::sanitizesub", $str );
return str_replace( "\0", '', $str );
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
in_array関数について
-
特定の文からメールアドレスの...
-
配列から表の生成
-
濁点のソート
-
$arrN[0] = $arrN[1] = $arrN[2...
-
かなでの並び替え
-
C言語 最大値と最小値を求めて...
-
array_intersectで空欄を比較し...
-
phpのエラーについて
-
多次元配列をエンコードする関...
-
読み(あ行~わ行)ごとに分け...
-
HTML_QuickFormのAdvCheckBox ...
-
PHPで配列から値を取得したい
-
PHPのmin関数、「1」以上の数値...
-
配列の要素(value)に、変数を...
-
fgetc関数について
-
CSVでアップロードしたデータの...
-
Resource id #3 と表示されま...
-
String だと「 ByRef引数の型が...
-
file_existsでファイル名の部分...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の要素(value)に、変数を...
-
特定の文からメールアドレスの...
-
読み(あ行~わ行)ごとに分け...
-
C言語の配列をPush(追加)する...
-
STLのvectorで作った配列をメン...
-
CArrayの要素としてCStringArra...
-
verilogで、配列の一部をタスク...
-
System.String.Splitでエラー
-
Perlで重複行を削除したい
-
行列
-
C言語 最大値と最小値を求めて...
-
スカラーのベクトル微分
-
PHPで2次元配列を1次元配列に...
-
array_intersectで空欄を比較し...
-
mallocで char *型の配列を確...
-
Pascalの手続きについて
-
複数のforeachをまとめるには
-
数独かを判断するプログラム
-
ソートの名称について
-
PHPのmin関数、「1」以上の数値...
おすすめ情報