PHP Conference Japan 2024

stripslashes

(PHP 4, PHP 5, PHP 7, PHP 8)

stripslashes取消引用带引号的字符串

描述

stripslashes(string $string): string

取消引用带引号的字符串。

stripslashes() 可用于您不将这些数据插入需要转义的位置(例如数据库)的情况。例如,如果您只是直接从 HTML 表单输出数据。

参数

string

输入字符串。

返回值

返回一个删除了反斜杠的字符串。(\' 变成 ' 等等。)双反斜杠 (\\) 变成了单个反斜杠 (\)。

示例

示例 #1 stripslashes() 示例

<?php
$str
= "Is your name O\'reilly?";

// 输出:Is your name O'reilly?
echo stripslashes($str);
?>

注意:

stripslashes() 不是递归的。如果您想将此函数应用于多维数组,则需要使用递归函数。

示例 #2 对数组使用 stripslashes()

<?php
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);

return
$value;
}

// 示例
$array = array("f\\'oo", "b\\'ar", array("fo\\'o", "b\\'ar"));
$array = stripslashes_deep($array);

// 输出
print_r($array);
?>

以上示例将输出

Array
(
    [0] => f'oo
    [1] => b'ar
    [2] => Array
        (
            [0] => fo'o
            [1] => b'ar
        )

)

参见

添加注释

用户贡献的注释 30 条注释

ivijan dot stefan at gmail dot com
10 年前
有时由于某些原因,PHP 或 Javascript 或某些恶意插入会插入大量反斜杠。普通函数没有注意到这一点。因此,有必要进行“膨胀”操作。

<?php
function removeslashes($string)
{
$string=implode("",explode("\\",$string));
return
stripslashes(trim($string));
}

/* 示例 */

$text="My dog don\\\\\\\\\\\\\\\\'t like the postman!";
echo
removeslashes($text);
?>

结果:My dog don't like the postman!

这个技巧对我很有帮助,因为我以前遇到过这个问题。
shredder at technodrome dot com
15 年前
你好,

这里有递归 addslashes / stripslashes 函数。
给定一个字符串 - 它将简单地添加/删除反斜杠
给定一个数组 - 它将递归地从数组及其所有子数组中添加/删除反斜杠。
如果值不是字符串或数组 - 它将保持不变!

<?php

function add_slashes_recursive( $variable )
{
if (
is_string( $variable ) )
return
addslashes( $variable ) ;

elseif (
is_array( $variable ) )
foreach(
$variable as $i => $value )
$variable[ $i ] = add_slashes_recursive( $value ) ;

return
$variable ;
}

function
strip_slashes_recursive( $variable )
{
if (
is_string( $variable ) )
return
stripslashes( $variable ) ;
if (
is_array( $variable ) )
foreach(
$variable as $i => $value )
$variable[ $i ] = strip_slashes_recursive( $value ) ;

return
$variable ;
}

?>
tarmo at goyf dot de
12 年前
当将包含撇号的字符串与 mysql 数据库进行匹配时,我的查询一直失败,而当我复制相同的查询直接执行数据库查询时,它却可以正常工作。经过几个小时的查找,我发现 stripslashes() 使字符串变长,因此查询结果“不等于”。

此代码显示了行为(复制到“test.php”中)。替换 stripslashes 对我来说有效。

<?php
echo '<h2>Post-Data</h2>';
var_dump($_POST);

$f1 = trim(filter_var(stripslashes($_POST[form]), FILTER_SANITIZE_STRING));
echo
'<h2>stripslashes</h2>';
var_dump($f1);

$f2 = trim(str_replace("|","'",filter_var(str_replace("\'","|",$_POST[form]), FILTER_SANITIZE_STRING)));
echo
'<h2>workaround</h2>';
var_dump($f2);

echo
'<form action="test.php" method="post">
<input type="text" name="form">
<input type="submit">
</form>'
;
?>

输入 "foo'bar" 会产生以下输出
// Post-Data
// array(1) { ["form"]=> string(8) "foo\'bar" }
// stripslashes
// string(11) "foo'bar"
// workaround
// string(7) "foo'bar"
jeremycook0 at googlemail dot com
14 年前
以下是在 PHP 5.3 中使用递归闭包去除反斜杠的方法

<?php
if (get_magic_quotes_gpc()) {
$strip_slashes_deep = function ($value) use (&$strip_slashes_deep) {
return
is_array($value) ? array_map($strip_slashes_deep, $value) : stripslashes($value);
};
$_GET = array_map($strip_slashes_deep, $_GET);
$_POST = array_map($strip_slashes_deep, $_POST);
$_COOKIE = array_map($strip_slashes_deep, $_COOKIE);
}
?>

请注意,变量 '$strip_slashes_deep' 必须通过引用传递给闭包。我认为这是因为在创建闭包时,变量 '$strip_slashes_deep' 并不存在:闭包本身成为变量的值。通过引用传递解决了此问题。此闭包可以轻松地改编为使用其他去除反斜杠的方法,例如 preg_replace()。
Tom Worster
15 年前
一个在 utf-8 字符串上应该安全的替换方法。
<?php
preg_replace
(array('/\x5C(?!\x5C)/u', '/\x5C\x5C/u'), array('','\\'), $s);
?>
Anonymous
10 年前
建议使用 str_replace 而不是 explode/implode 来实现你的目的。
o-zone at zerozone dot it
15 年前
如果你需要从字符串中删除所有反斜杠,这里有一个快速解决方法

<?php
function stripallslashes($string) {
while(
strchr($string,'\\')) {
$string = stripslashes($string);
}
}
?>

希望它有用,O-Zone
stoic
17 年前
回复 crab dot crab at gmail dot com

$value 不需要通过引用传递。'stripped' 值会被返回。传递的值不会被更改。
eugene at ultimatecms dot co dot za
15 年前
这是一个简单的函数,用于删除诸如 magic_quotes_gpc 和 mysql_escape_string 等函数添加的反斜杠。

<?php

function no_magic_quotes($query) {
$data = explode("\\",$query);
$cleaned = implode("",$data);
return
$cleaned;
}

// 我使用 mysql_escape_string 作为简单的示例,但此函数适用于任何转义字符串。
$query = "It's amaizing! Who's to say this isn't a simple function?";
$badstring = mysql_escape_string($query);

echo
'<b>Without funtion:</b> '.$badstring;
echo
'<br><br>';
echo
'<b>With function:</b> '.no_magic_quotes($badstring);

?>

输出
Without funtion: It\'s amaizing! Who\'s to say this isn\'t a simple function?

With function: It's amaizing! Who's to say this isn't a simple function?
Aditya P Bhatt (adityabhai at gmail dot com)
16 年前
这是一个简单的示例代码,你可以将其用作函数文件中的通用函数

<?php
function stripslashes_if_gpc_magic_quotes( $string ) {
if(
get_magic_quotes_gpc()) {
return
stripslashes($string);
} else {
return
$string;
}
}
?>
dragonfly at networkinsight dot net
17 年前
如果你在使用 stripslashes() 时遇到损坏二进制数据的问题,请尝试使用 urlencode() 和 urldecode() 代替。
JAB Creations
17 年前
当写入 HTML 页面等平面文件时,你会注意到插入了反斜杠。当你写入该页面时,如何应用 stripslashes 很有意思...

我替换了以下代码行...
<?php fwrite($file, $_POST['textarea']); ?>

为以下代码...
<?php if (get_magic_quotes_gpc()) {fwrite ($file, stripslashes($_POST['textarea']));}?>

你必须直接将 stripslashes 应用于 $_POST、$_GET、$_REQUEST 和 $_COOKIE。
StefanoAI
11 年前
递归 stripslashes
<?php
if (get_magic_quotes_gpc()) {

function
stripslashes_array(&$arr) {
foreach (
$arr as $k => &$v) {
$nk = stripslashes($k);
if (
$nk != $k) {
$arr[$nk] = &$v;
unset(
$arr[$k]);
}
if (
is_array($v)) {
stripslashes_array($v);
} else {
$arr[$nk] = stripslashes($v);
}
}
}

stripslashes_array($_POST);
stripslashes_array($_GET);
stripslashes_array($_REQUEST);
stripslashes_array($_COOKIE);
}
?>
powerofBBC at gmail dot com
5 年前
$regex_pattern = "/<a href=\"(.*)\">(.*)<\/a>/";

if( (strlen($_POST['query']) > 0) && (preg_match_all($regex_pattern, $_POST['query']) )
{ echo "Tags found"; }
gregory at nutt dot ca
17 年前
这是我用来使用 stripslashes 函数清理 MySQL 查询结果的代码。

我通过将 SQL 结果和 SQL 列传递给函数 strip_slashes_mysql_results 来实现这一点。这样,我的数据在我想要使用它之前就已经被清理干净了。

function db_query($querystring, $array, $columns)
{
if (!$this->connect_to_mysql())
return 0;

$queryresult = mysql_query($querystring, $this->link)
or die("Invalid query: " . mysql_error());

if(mysql_num_rows($queryresult))
{
$columns = mysql_field_names ($queryresult);

if($array)
{
while($row = mysql_fetch_row($queryresult))
$row_meta[] = $this->strip_slashes_mysql_results($row, $columns);
return $row_meta;
}
else
{
while($row = mysql_fetch_object($queryresult))
$row_meta[] = $this->strip_slashes_mysql_results($row, $columns);
return $row_meta;
}
}
else
return 0;
}

function strip_slashes_mysql_results($result, $columns)
{
foreach($columns as $column)
{
if($this->debug)
printp(sprintf("strip_slashes_mysql_results: %s",strip_slashes_mysql_results));
$result->$column = stripslashes($result->$column);
}
返回 $result;
}
hash at samurai dot fm
21 年前
我想提醒读者,在使用 stripslashes 处理日文文本时要非常小心。Shift_JIS 字符集包含许多包含十六进制值 0x5c(反斜杠)的双字节字符,此函数会将其去除,从而导致这些字符乱码。

真是个噩梦!
todd at toddzebert dot com
12 年前
在 PHP 5.2.17 中尝试对数组使用 stripslashes 会返回字符串 "Array",但在 5.3.6 中会返回 NULL。
michal at roszka dot pl
15 年前
目标是在 PHP 5.2.8 中保持输入不变。假设此示例文本在 $_POST['example'] 中给出

一个反斜杠 ( \ ),一个单引号 ( ' ),一个双引号 ( " ) 和一个空字符 ( \0 )

让我们编写两个简单的脚本

脚本 A
<?php echo $_POST['example']; ?>

脚本 B
<?php echo stripslashes($_POST['example']); ?>

让我们设置四种不同的配置并查看相应的输出

案例 #1

* magic_quotes_gpc = Off
* magic_quotes_sybase = Off

A: 一个反斜杠 ( \ ),一个单引号 ( ' ),一个双引号 ( " ) 和一个空字符 ( \0 )
B: 一个反斜杠 ( ),一个单引号 ( ' ),一个双引号 ( " ) 和一个空字符 ( � )

案例 #2

* magic_quotes_gpc = On
* magic_quotes_sybase = Off

A: 一个反斜杠 ( \\ ),一个单引号 ( \' ),一个双引号 ( \" ) 和一个空字符 ( \\0 )
B: 一个反斜杠 ( \ ),一个单引号 ( ' ),一个双引号 ( " ) 和一个空字符 ( \0 )

案例 #3

* magic_quotes_gpc = On
* magic_quotes_sybase = On

A: 一个反斜杠 ( \ ),一个单引号 ( '' ),一个双引号 ( " ) 和一个空字符 ( \0 )
B: 一个反斜杠 ( \ ),一个单引号 ( ' ),一个双引号 ( " ) 和一个空字符 ( � )

案例 #4

* magic_quotes_gpc = Off
* magic_quotes_sybase = On

A: 一个反斜杠 ( \ ),一个单引号 ( ' ),一个双引号 ( " ) 和一个空字符 ( \0 )
B: 一个反斜杠 ( ),一个单引号 ( ' ),一个双引号 ( " ) 和一个空字符 ( � )

结论

1) 如果 magic_quotes_gpc 已禁用,则我们无需执行任何操作(案例 1 和 4);
2) 只有在 magic_quotes_gpc 已启用但 magic_quotes_sybase 已禁用时,stripslashes($_POST['example']) 才能正常工作(案例 2);
3) 如果 magic_quotes_gpc 和 magic_quotes_sybase 都已启用,则 str_replace("''", "'", $_POST['example']) 将解决问题(案例 3);

<?php
function disable_magic_quotes_gpc()
{
if (
TRUE == function_exists('get_magic_quotes_gpc') && 1 == get_magic_quotes_gpc())
{
$mqs = strtolower(ini_get('magic_quotes_sybase'));

if (
TRUE == empty($mqs) || 'off' == $mqs)
{
// 我们需要对 $_GET、$_POST 和 $_COOKIE 进行 stripslashes 处理
}
else
{
// 我们需要对 $_GET、$_POST、$_COOKIE 进行 str_replace("''", "'", ...) 处理
}
}
// 否则我们无需执行任何操作
}
?>

重要说明

1) 数组需要递归处理;

2) stripslashes 和 str_replace 函数始终返回字符串,因此

* TRUE 将变为字符串 "1",
* FALSE 将变为空字符串,
* 整数和浮点数将变为字符串,
* NULL 将变为空字符串。

另一方面,您只需要处理字符串,因此使用 is_string 函数进行检查;

3) 在处理其他(非 GPC)数据源(例如数据库或文本文件)时,请记住也要使用 magic_quotes_runtime 设置,查看会发生什么并编写相应的函数,例如 disable_magic_quotes_runtime() 或类似的函数。

4) 非常重要:在测试时,请记住空字符。否则,您的测试将无法得出结论,您最终可能会遇到……嗯,严重的错误 :)
alex dot launi at gmail dot com
16 年前
kibby:我修改了 stripslashes_deep() 函数,以便可以在 NULL 值上使用它。

function stripslashes_deep($value)
{
if(isset($value)) {
$value = is_array($value) ?
array_map('stripslashes_deep', $value)
stripslashes($value);
}
return $value;
}
lukas.skowronski at gmail dot com
17 年前
如果您想删除任何表中的所有反斜杠,请尝试使用我的函数

function no_slashes($array)
{
foreach($array as $key=>$value)
{
if(is_array($value))
{
$value=no_slashes($value);
$array_temp[$key]=$value;
}
else
{
$array_temp[$key]=stripslashes($value);
}
}
return $array_temp;
}
Kibby
18 年前
好的,如果使用 stripslashes_deep,它肯定会在任何 NULL 上替换为 ""。这将影响依赖 isset() 的编码。请根据最近的说明提供解决方法。
mattyblah at gmail dot com
20 年前
应该注意的是,如果您正在去除反斜杠以去除 magic_quotes_gpc 添加的反斜杠,那么它也会去除 \ 中的反斜杠。这可能看起来并不糟糕,但如果您让某人输入类似 'testing\' 的文本,并在末尾添加一个反斜杠,如果未更正,这将导致错误。最好去除反斜杠,然后使用 $text = str_replace('\\', '\\\\', $text); 为每个反斜杠添加一个反斜杠。
Yousef Ismaeil Cliprz
11 年前
如果您想对字符串或数组使用 stripslashes(); 函数,您可以创建一个用户函数

例如

<?php

if (!function_exists('strip_slashes'))
{
/**
* 取消引用字符串。
*
* @param (mixed) $str - 输入字符串。
* @author Yousef Ismaeil Cliprz
*/
function strip_slashes($str)
{
if (
is_array($str))
{
foreach (
$str as $key => $val)
{
$str[$key] = strip_slashes($val);
}
}
else
{
$str = stripslashes($str);
}

return
$str;
}
}

$arr = array('Yousef\\\'s','\"PHP.net\"','user\\\'s');

echo
'With strip_slashes() function:<br />';
print_r(strip_slashes($arr));
echo
'<br />';
echo
'Without strip_slashes() function:<br />';
print_r($arr);

/** 您将获得
With strip_slashes() function:
Array ( [0] => Yousef's [1] => "PHP.net" [2] => user's )
Without strip_slashes() function:
Array ( [0] => Yousef\'s [1] => \"PHP.net\" [2] => user\'s )
*/

?>
JacobRas.nl
15 年前
你好,

这是一个不仅去除 \',还去除 \\' 和 \\\' 等等的函数(取决于 $times)。$text 是需要去除的文本,$times 是需要去除的反斜杠数量。

<?php

function stripslashes_deep ($text, $times) {

$i = 0;

// 循环将执行 $times 次。
while (strstr($text, '\\') && $i != $times) {

$text= stripslashes($text);
$i++;

}

return
$text;

}

?>

示例:$text = \\'quote\\' 。<?php stripslashes_deep($text, 2); ?> 将返回 'quote'。
注意:<?php stripslashes_deep($text, 3); ?> 也将返回 'quote'。
Anonymous
19 年前
如果您想处理双字节编码(如 Shift_JIS 或 Big5)中的反斜杠,您可以使用以下方法

<?
function stripslashes2($string) {
$string = str_replace("\\\"", "\"", $string);
$string = str_replace("\\'", "'", $string);
$string = str_replace("\\\\", "\\", $string);
return $string;
}
?>
techdesk100
16 年前
检查 $input 是否具有正确反斜杠的函数,
否则添加反斜杠。对于您不确定输入是否已添加反斜杠的情况。

public function addslashes_once($input){
//这些字符是单引号 (')、双引号 (")、反斜杠 (\) 和 NUL(空字节)。
$pattern = array("\\'", "\\\"", "\\\\", "\\0");
$replace = array("", "", "", "");
if(preg_match("/[\\\\'\"\\0]/", str_replace($pattern, $replace, $input))){
return addslashes($input);
}
else{
return $input;
}
}
jeremysawesome
13 年前
我正在使用它来清理 $_POST 数组
<?php
array_walk_recursive
($_POST, create_function('&$val', '$val = stripslashes($val);'));
?>
hauser dot j at gmail dot com
18 年前
如果您依赖 NULL 值,请不要使用 stripslashes。

显然 stripslashes 会将 NULL 转换为字符串(0) ""

<?php
$a
= null;
var_dump($a);

$b = stripslashes($a);
var_dump($b);
?>
输出结果

NULL
string(0) ""
dragon[dot]dionysius[at]gmail[dot]com
15 年前
我在我的类中使用此函数对数组进行去除反斜杠操作,包括 NULL 检查

<?php
private function stripslashes_deep($value) {
if(
is_array($value)) {
foreach(
$value as $k => $v) {
$return[$k] = $this->stripslashes_deep($v);
}
} elseif(isset(
$value)) {
$return = stripslashes($value);
}
return
$return;
}
?>
alf at mitose dot net
19 年前
如果要插入数据库的文本包含 \n 字符,请小心使用 stripslashes()!您将看到 "n" 而不是 (看不到) "\n"。

对于 XML 来说应该没问题,但仍然很烦人...
To Top