2011年9月13日火曜日

PHPでフィルタリングを連続して適用したい



日中はずっとPHPと睨めっこです。息抜きに書くPHPも必要。とりあえず、1日1つは息抜きで何かを書きます。



フィルタリングを連続して適用する


1つ前の記事、PHPで入力された文字列の長さのフィルタリング - はなちん C-x C-cで書いたフィルタを連続して適用したかったのでごにょごにょ書いてたらこうなりました。



<?php
function strWithLine($str) {
return str_repeat('-', 8) . $str . str_repeat('-', 8);
}

function makeFilterValidateLength($min, $max, $encoding = null) {
if (is_null($encoding)) {
$encoding = mb_internal_encoding();
}

return function ($value) use ($min, $max, $encoding) {
$len = mb_strlen($value, $encoding);
if ($min <= $len && $len <= $max) {
return $value;
}
return false;
};
}

function makeFilterWrapped($filter = FILTER_UNSAFE_RAW, $options = null) {
return function ($value) use ($filter, $options) {
return filter_var($value, $filter, $options);
};
}

function ret($value) {
return $value;
}

function bind($f, $g) {
return function ($value) use ($f, $g) {
if ($f($value) === false) {
return false;
}
return $g($value);
};
}

$test = 'example@example.com';
$m = 'ret';
$f1 = makeFilterValidateLength(0, 1);
$f2 = makeFilterValidateLength(0, 19);
$g = makeFilterWrapped(FILTER_VALIDATE_EMAIL);
$fail_filters = array(
bind('ret', $f1),
$f1,
bind($f1, 'ret'),
$f1,
bind(bind($m, $f1), $g),
bind($m, bind(function ($x) use($f1) { return $f1($x); }, $g)),
);
$pass_filters = array(
bind('ret', $f2), $f2,
bind($f2, 'ret'), $f2,
bind(bind($m, $f2), $g), bind($m, bind(function ($x) use($f2) { return $f2($x); }, $g)),
);

echo strWithLine('fail_filters'), PHP_EOL;
foreach ($fail_filters as $filter) {
var_dump(filter_var($test, FILTER_CALLBACK, array('options' => $filter)));
}

echo strWithLine('pass_filters'), PHP_EOL;
foreach ($pass_filters as $filter) {
var_dump(filter_var($test, FILTER_CALLBACK, array('options' => $filter)));
}


もっと色々とうまく出来るようになりたい。





0 件のコメント:

コメントを投稿