清理过滤器

用于清理的过滤器列表
ID 名称 标志 描述
FILTER_SANITIZE_EMAIL "email"   删除除字母、数字和 !#$%&'*+-=?^_`{|}~@.[] 之外的所有字符。
FILTER_SANITIZE_ENCODED "encoded" FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_STRIP_BACKTICK, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH URL 编码字符串,可选地去除或编码特殊字符。
FILTER_SANITIZE_MAGIC_QUOTES "magic_quotes"   应用 addslashes()。 (自 PHP 7.3.0 起已弃用,自 PHP 8.0.0 起已移除,请使用 FILTER_SANITIZE_ADD_SLASHES 代替。)
FILTER_SANITIZE_ADD_SLASHES "add_slashes"   应用 addslashes()。 (自 PHP 7.3.0 起可用)
FILTER_SANITIZE_NUMBER_FLOAT "number_float" FILTER_FLAG_ALLOW_FRACTION, FILTER_FLAG_ALLOW_THOUSAND, FILTER_FLAG_ALLOW_SCIENTIFIC 删除除数字、+- 和可选的 .,eE 之外的所有字符。
FILTER_SANITIZE_NUMBER_INT "number_int"   删除除数字、加号和减号以外的所有字符。
FILTER_SANITIZE_SPECIAL_CHARS "special_chars" FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_STRIP_BACKTICK, FILTER_FLAG_ENCODE_HIGH HTML 编码 '"<>& 和 ASCII 值小于 32 的字符,可选地去除或编码其他特殊字符。
FILTER_SANITIZE_FULL_SPECIAL_CHARS "full_special_chars" FILTER_FLAG_NO_ENCODE_QUOTES 等同于使用 ENT_QUOTES 设置调用 htmlspecialchars()。通过设置 FILTER_FLAG_NO_ENCODE_QUOTES 可以禁用编码引号。与 htmlspecialchars() 一样,此过滤器知道 default_charset,如果检测到构成当前字符集中无效字符的字节序列,则整个字符串将被拒绝,导致 0 长度的字符串。将此过滤器用作默认过滤器时,请参见下面关于将默认标志设置为 0 的警告。
FILTER_SANITIZE_STRING "string" FILTER_FLAG_NO_ENCODE_QUOTES, FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_STRIP_BACKTICK, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH, FILTER_FLAG_ENCODE_AMP 去除标签和 HTML 编码双引号和单引号,可选地去除或编码特殊字符。通过设置 FILTER_FLAG_NO_ENCODE_QUOTES 可以禁用编码引号。 (自 PHP 8.1.0 起已弃用,请使用 htmlspecialchars() 代替。)
FILTER_SANITIZE_STRIPPED "stripped"   "string" 过滤器的别名。 (自 PHP 8.1.0 起已弃用,请使用 htmlspecialchars() 代替。)
FILTER_SANITIZE_URL "url"   删除除字母、数字和 $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&= 之外的所有字符。
FILTER_UNSAFE_RAW "unsafe_raw" FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_STRIP_BACKTICK, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH, FILTER_FLAG_ENCODE_AMP 不做任何事,可选地去除或编码特殊字符。此过滤器也与 FILTER_DEFAULT 别名。

警告

在通过你的 ini 文件或你的 Web 服务器的配置使用这些过滤器之一作为默认过滤器时,默认标志被设置为 FILTER_FLAG_NO_ENCODE_QUOTES。你需要显式地将 filter.default_flags 设置为 0 才能默认编码引号。就像这样

示例 #1 配置默认过滤器以像 htmlspecialchars 一样工作

filter.default = full_special_chars
filter.default_flags = 0

变更日志

版本 描述
8.1.0 FILTER_SANITIZE_STRINGFILTER_SANITIZE_STRIPPED 已被弃用。
8.0.0 FILTER_SANITIZE_MAGIC_QUOTES 已被移除。
7.3.0 FILTER_SANITIZE_ADD_SLASHES 已被添加来替换 FILTER_SANITIZE_MAGIC_QUOTES
7.3.0 FILTER_SANITIZE_MAGIC_QUOTES 已被弃用。

添加笔记

用户贡献笔记 17 个笔记

9
finkenb2 at msu dot edu
8 个月前
随着 FILTER_SANITIZE_STRING 的弃用,“使用 htmlspecialchars 代替”是一个不完整的注释。FILTER_SANITIZE_STRING 的功能是 htmlspcialchars 和 (大约) strip_tags 的组合。为了真正的兼容性,可能需要一个 polyfil

<?php
function filter_string_polyfill(string $string): string
{
$str = preg_replace('/\x00|<[^>]*>?/', '', $string);
return
str_replace(["'", '"'], ['&#39;', '&#34;'], $str);
}

$string = "Some \"' <bizzare> string & to Sanitize < !$@%";
echo
filter_var($string,FILTER_SANITIZE_STRING).PHP_EOL;
//Some &#34;&#39; string & to Sanitize

echo htmlspecialchars($string).PHP_EOL;
//Some &quot;&#039; &lt;bizzare&gt; string &amp; to Sanitize &lt; !$@%

echo strip_tags($string).PHP_EOL;
//Some "' string & to Sanitize < !$@%

echo htmlspecialchars(strip_tags($string,ENT_QUOTES)).PHP_EOL;
//Some &quot;&#039; string &amp; to Sanitize &lt; !$@%

echo filter_string_polyfill($string).PHP_EOL;
//Some &#34;&#39; string & to Sanitize
66
googlybash24 at aol dot com
11 年前
请记住在应用过滤器之前对 $_POST 进行 trim() 操作

<?php

// 在任何空格被编码为"%20"之前,我们修剪 $_POST 数据

// 使用此函数 "trim_value" 修剪数组值
function trim_value(&$value)
{
$value = trim($value); // 这将删除字符串开头和结尾的空白字符和相关字符
}
array_filter($_POST, 'trim_value'); // $_POST 中的数据被修剪

$postfilter = // 设置用于修剪后的 POST 数组的过滤器
array(
'user_tasks' => array('filter' => FILTER_SANITIZE_STRING, 'flags' => !FILTER_FLAG_STRIP_LOW), // 移除标签。格式化代码被编码 - 在显示时添加 nl2br()
'username' => array('filter' => FILTER_SANITIZE_ENCODED, 'flags' => FILTER_FLAG_STRIP_LOW), // 我们在 URL 中使用它
'mod_title' => array('filter' => FILTER_SANITIZE_ENCODED, 'flags' => FILTER_FLAG_STRIP_LOW), // 我们在 URL 中使用它
);

$revised_post_array = filter_var_array($_POST, $postfilter); // 必须通过变量引用,该变量现在是一个数组,它取代了 $_POST[]
echo (nl2br($revised_post_array['user_tasks'])); //-- 使用 nl2br() 在输出时使用它,用于 ['user_tasks'] 数组值,以便格式化换行符,因为这是我们的 HTML <textarea> 字段,我们希望保持换行符
?>
61
匿名
8 年前
FILTER_SANITIZE_STRING 的行为与 strip_tags 函数不同。strip_tags 允许从上下文中推断出的小于符号,FILTER_SANITIZE_STRING 无论如何都会剥离。
<?php
$smaller
= "not a tag < 5";
echo
strip_tags($smaller); // -> not a tag < 5
echo filter_var ( $smaller, FILTER_SANITIZE_STRING); // -> not a tag
?>
16
ipse at sergiosantos dot me
3 年前
虽然在上面的文档中专门提到了这一点,但由于许多人发现这很不直观,因此值得指出的是,除非您指定 FILTER_FLAG_ALLOW_FRACTION,否则 FILTER_SANITIZE_NUMBER_FLOAT 会删除小数点字符。

<?php
$number_string
= '12.34';

echo
filter_var( $number_string, FILTER_SANITIZE_NUMBER_FLOAT ); // 1234

echo filter_var( $number_string, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ); // 12.34
?>
28
Willscrlt
8 年前
要包含多个标志,只需用竖线符号分隔这些标志。

例如,如果您想使用 filter_var() 使用 FILTER_SANITIZE_STRING 对 $string 进行清理,并将 FILTER_FLAG_STRIP_HIGH 和 FILTER_FLAG_STRIP_LOW 传递进去,只需像这样调用它

$string = filter_var($string, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW);

在使用回调的情况下,对于在选项数组中传递标志字段也是如此。

$var = filter_var($string, FILTER_SANITIZE_SPECIAL_CHARS,
array('flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_ENCODE_HIGH));

感谢 Popmartian.com/tipsntricks/ 上的 Brain Goo 博客提供此信息。
16
AntonioPrimera
8 年前
请注意,当将 filter_var() 与 FILTER_SANITIZE_NUMBER_FLOAT 和 FILTER_SANITIZE_NUMBER_INT 一起使用时,结果将是字符串,即使输入值实际上是浮点数或整数。

使用 FILTER_VALIDATE_FLOAT 和 FILTER_VALIDATE_INT,它们会将结果转换为预期类型。
23
marcus at synchromedia dot co dot uk
14 年前
LOW 和 HIGH 范围并不完全清楚。LOW 是低于 32 的字符,HIGH 是高于 127 的字符,即在 ASCII 范围之外。

<?php
$a
= "\tcafé\n";
// 这将删除制表符和换行符
echo filter_var($a, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
// 这将删除 é。
echo filter_var($a, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
?>
13
galvao at galvao dot eti dot br
11 年前
为了澄清,因为很多人可能不知道这一点

高于 127 的 ASCII 字符被称为“扩展字符”,它们表示希腊字母和拉丁字母中的带重音字母,在葡萄牙语等语言中使用。

除了已经提到的维基百科文章之外,一个很好的 ASCII 快速参考可以在这里找到:http://www.asciicodes.com/
5
david dot drakulovski at gmail dot com
10 年前
以下是一个更简单、更具表现力的 ASCII 列表,用于 <32 或 127> 过滤器
(如果维基百科让你困惑)

http://www.danshort.com/ASCIImap/
2
terry dot marsault at gmail dot com
3 个月前
这些参数都不能满足我的需求,所以我创建了自己的函数,希望它对其他一些人有所帮助!

function removeSpecialChars($valueToClean)
{
return htmlspecialchars(str_replace([",", "#", "$", "%", "*", "~", "'", "=", "{", "[", "|", "`", "^", "]", "}", ":", ";", "<", ">", "/", "?", "&"], "", $valueToClean));
}
-2
darren at daz-web dot com
5 年前
对于那些正在寻找一种简单的方法来过滤包含 textarea 元素的 POST 表单的人来说。如果您还需要制表符等,您可以很容易地扩展它。

<?php
// 创建所有相关 textarea 的数组
$textareas = array("ta1");

foreach(
$_POST as $k => $v)
{
$v = trim($v);// 因此我们确保它在两端都没有空格

// 为 textarea 答案保留换行符
if(in_array($k,$textareas))$v=str_replace("\n","[NEWLINE]",$v);

// 清理字符串
$v = filter_var($v, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK);

// 现在将占位符替换为原始换行符
$_POST[$k] = str_replace("[NEWLINE]","\n",$v);
}

// 用于测试提交的简单表单

?><!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>过滤器测试</title>
</head>

<body>

<form action="" method="post">
<p>
<textarea name="ta1" cols="30" rows="10"><?php echo $_POST['ta1']; ?></textarea>
</p>
<p>
<input type="text" name="txt1" size="30" value="<?php echo $_POST['txt1']; ?>" />
</p>
<p>
<input type="submit" />
</p>
</form>

</body>

</html>
-9
adellemfrank at hotmail dot com
12 年前
一个好的 ASCII 字符列表,说明哪些 ASCII 字符 < 32 以及 > 127,可以在以下位置找到:http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters
-7
Rodrigo Guariento
4 年前
要从字符串中获取仅数字,请使用以下代码
echo preg_replace('/[^0-9]/', '', '123456-789');
-12
匿名
4 年前
在“FILTER_SANITIZE_URL”部分,它说“删除所有字符,除了字母、数字和 $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=.”,为什么会出现双反斜杠 (\\)?如果它说允许反斜杠,不应该只有一个反斜杠吗?
-28
匿名
11 年前
从 5.3.3 版本开始添加了对 FILTER_SANITIZE_FULL_SPECIAL_CHARS 的支持
-10
匿名
4 年前
<?php
/*
过滤所有 ASCII 字符,只保留 0-9、a-Z 和 @ . _
*/

echo alphanum('abcdefghABCDEFGH0123456789/!:;@._');
// 返回 abcdefghABCDEFGH0123456789@._

function alphanum( $string , $x=''){
$h=strlen($string);
for(
$a=0; $a<$h; $a++) {
$i = ord($string[$a]);
if(
(
$i==46) || // .
($i==64) || // @
($i==95) || // _
($i > 47 && $i < 58) || //0123456789
($i > 64 && $i < 91) || //ABCDEFGH..Z
($i > 96 && $i < 123) //abcdefgh..z
) { $x .= $string[$a]; }
}
return
$x;
}

?>
-41
Dmitry Snytkine
13 年前
注意 FILTER_FLAG_STRIP_LOW 会去除换行符、标签和回车符。如果您有一个接受纯文本格式用户输入的表单,则所有提交的文本都会丢失所有换行符,使其显示在一行上。这基本上使此过滤器对于解析用户提交的文本毫无用处,即使在纯文本中也是如此。
To Top