其他过滤器

杂项过滤器的列表
ID 名称 选项 标志 描述
FILTER_CALLBACK "callback" 可调用 函数或方法 所有标志都被忽略 调用用户定义的函数来过滤数据。

添加注释

用户贡献的注释 6 个注释

33
thatindividual dot zhang at gmail dot com
9 年前
这是一个例子,因为我在 php.net 上找不到一个。

<?php

/**
* 从字符串的开头和结尾去除空白(或其他不可打印字符)
* @param string $value
*/
function trimString($value)
{
return
trim($value);
}

$loginname = filter_input(INPUT_POST, 'loginname', FILTER_CALLBACK, array('options' => 'trimString'));
12
Vufi
8 年前
您是否也在为如何将参数发送到 FILTER_CALLBACK 而苦恼?

假设您想拥有一组自定义过滤器,您可以在 filter_var、filter_var_array 等等中使用它们,但您希望能够像在 filter_var 中一样用不同的参数调用这些新的过滤器。

最简单的方法是创建一个包含所有自定义过滤器的类。然后在 filter_var 参数数组中用您的参数构造这个类,并在其中输入您想运行的方法。

如果您将参数发送为数组,则可以轻松地进行默认值设置。但是您可以通过此解决方案传递任意数量的参数,无论它们是什么类型。

例子
<?php
/**
* 自定义过滤器类
* 为 filter_var、filter_var_array、filter_input、filter_input_array 提供自定义过滤器
*/
class CustomFilters {
private
$options = array();

public function
__construct(array $options=array()){
$this->options = $options;
}

/**
* 返回默认选项与构造函数选项合并后的结果
* @param array $defaults
* @return array
*/
private function get_options(array $defaults){
return
array_merge($defaults, $this->options);
}

/**
* 检查值是否在范围内
* @param mixed $val 由 filter_var 提供的值
* @return mixed
*/
public function FILTER_STEP_RANGE($val){
$options = $this->get_options(
// 默认选项
array(
"min_range" => 1,
"max_range" => 10,
"step" => 1,
"default" => null, // 失败时返回的值
"strict" => false, // 检查值是否为正确类型
"cast" => false // 将值转换为特定类型
)
);

if(
in_array( $val, range($options["min_range"], $options["max_range"], $options["step"]), $options["strict"])){

// 如果值无法转换为正确类型,则返回默认值
if( $options["cast"] && !settype($val, $options["cast"])) {
return
$options["default"];
}

return
$val;
}else{
return
$options["default"];
}
}

/**
* 检查值是否在数组中
* @param mixed $val 由 filter_var 提供的值
* @return mixed
*/
public function FILTER_ENUM($val){
$options = $this->get_options(
// 默认选项
array(
"values" => array(),
"strict" => false, // 失败时返回的值
"default" => null, // 检查值是否为正确类型
"cast" => false // 将值转换为特定类型
)
);

if(
in_array($val, $options["values"], $options["strict"])){

// 如果值无法转换为正确类型,则返回默认值
if( $options["cast"] && !settype($val, $options["cast"])){
return
$options["default"];
}

return
$val;
}else{
return
$options["default"];
}
}
}

$data = array(
"range1" => "200",
"range2" => 25,
"enum" => "yes"
);

$args = array(
"range1" => array(
"filter" => FILTER_CALLBACK,
"options" => array(
new
CustomFilters(array( "min_range" => 10, "max_range" => 600, "step" => 10, "default" => 120,
"cast" => "integer")),
'FILTER_STEP_RANGE'
)
),

"range2" => array(
"filter" => FILTER_CALLBACK,
"options" => array(
new
CustomFilters(array( "min_range" => 0, "max_range" => 1, "step" => .1, "default" => .5,
"cast" => "float")),
'FILTER_STEP_RANGE'
)
),
"enum" => array(
"filter" => FILTER_CALLBACK,
"options" => array(
new
CustomFilters(array( "values" => array("yes", "no", "Yes","No"), "cast" => "string")),
'FILTER_ENUM'
)
)
);

var_dump( filter_var_array($data, $args) );
?>

返回值
array(3) {
["range1"] => int(200)
["range2"] => float(0.5)
["enum"] => string(3) "yes"
}
8
johnk at riceball dot com
6 years ago
以下是如何创建带参数的可调用函数。这些函数返回闭包。当你调用它们时,你提供已知的参数,它会返回一个函数,该函数将接受来自 filter_input() 或 filter_input_array() 的值。

<?php

function filter_sanitize_int_range_generator($low, $high) {
return function(
$value = null) use ($low, $high) {
$v = intval($value);
if (
$v < $low) return false;
if (
$v > $high) return false;
return
$v;
};
}

function
filter_sanitize_string_in_array_generator($array) {
return function(
$value = null) use ($array) {
if (!
is_string($value)) return false;
if (
in_array($value, $array)) return $value;
return
false;
};
}

echo
"TESTING RANGE\n";
$fun = filter_sanitize_int_range_generator(1,10);
var_dump($fun(5)); // 5
var_dump((filter_sanitize_int_range_generator(1,10))(0)); // false
var_dump((filter_sanitize_int_range_generator(1,10))(1)); // 1
var_dump((filter_sanitize_int_range_generator(1,10))(10)); // 10
var_dump((filter_sanitize_int_range_generator(1,10))(11)); // false
var_dump($fun()); // false

echo "TESTING IN ARRAY\n";
$fun = filter_sanitize_string_in_array_generator(['cat','dog','bird']);
var_dump($fun('cat')); // cat
var_dump($fun('dog')); // dog
var_dump($fun('bird')); // bird
var_dump($fun('fish')); // false
var_dump($fun()); // false

// use it like this
filter_input(INPUT_GET, 'month', FILTER_CALLBACK, array( "callable" => filter_sanitize_int_range_generator(1,12) ) );
6
shaman_master at list dot ru
4 years ago
注意:不要像“顶部”注释中那样将 PHP 函数包装在闭包中
<?php
$str
= filter_input(INPUT_GET, 'str', FILTER_CALLBACK, ['options' => 'trim']);
?>
3
christof at himalayasystemsNOSPAM dot be
9 年前
提供的回调函数也可以是类方法。(自 5.4.0 起?)
要使用方法,您需要将 options 参数设置为包含两个值的数组:第一个是对象,第二个是方法名称。

<?php
/**
* @property-read $language
*/
class GetInputStore {
private
$allowed_languages = array('en', 'fr', 'de', 'nl' /*, ... */);
private
$language;

public function
__construct(){
$this->language = filter_input(INPUT_GET, 'language', FILTER_CALLBACK, array('options' => array($this, 'get_language_code')));
}

public function
__get($name){
switch(
$name){
case
'language' : return $this->language;
default : throw new
Exception("The GetInputStore class doesn't support GET param \"$name\"");
}
}

private function
get_language_code($code){
if(
in_array($code, $this->allowed_languages)){
return
$code;
} else {
return
'en';
}
}
}
?>
0
commonpike
5 years ago
一些有用的自定义过滤器

<?php

function sanitizeOptions($array,$default) {
return function(
$value = null) use ($array,$default) {
if (
in_array($value, $array)) return $value;
return
$default;
};
}

function
sanitizeKey($value) {
return
strtolower(preg_replace('/[^a-zA-Z0-9-_\.]/','', $value));
}

/*usage */

filter_var($format, FILTER_CALLBACK, array(
"options" => sanitizeOptions(['html','json','blob'],'json')
));

filter_var($format,FILTER_CALLBACK, array(
"options" => 'sanitizeKey'
));

?>
To Top