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
        )

)

参见

添加笔记

用户贡献笔记 31 个笔记

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
9 年前
为了你的目的,最好使用 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
14 年前
这是一个简单的函数,用于删除由 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。
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;
}
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);
}
return $result;
}
hash at samurai dot fm
20 年前
我需要提醒读者,在使用 stripslashes 处理日语文本时要格外小心。Shift_JIS 字符集包含许多包含十六进制值 0x5c(反斜杠)的双字节代码字符,这些字符会被此函数剥离,从而导致这些字符乱码。

简直是噩梦!
todd at toddzebert dot com
12 年前
尝试在 5.2.17 版本中对数组使用 stripslashes 会返回字符串 "Array",但在 5.3.6 版本中则会返回 NULL。
michal at roszka dot pl
14 年前
目标是在 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) stripslashes($_POST['example']) 仅在 magic_quotes_gpc 启用但 magic_quotes_sybase 禁用时有效(情况 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;
}
Kibby
18 年前
好的,如果使用 stripslashes_deep,它一定会将任何 NULL 替换为 ""。这会影响依赖 isset() 的编码。请根据最近的说明提供一个解决方法。
mattyblah at gmail dot com
19 年前
需要注意的是,如果您要删除 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
'使用 strip_slashes() 函数:<br />';
print_r(strip_slashes($arr));
echo
'<br />';
echo
'不使用 strip_slashes() 函数:<br />';
print_r($arr);

/** 您将得到
使用 strip_slashes() 函数:
Array ( [0] => Yousef's [1] => "PHP.net" [2] => user's )
不使用 strip_slashes() 函数:
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
18 年前
在使用 stripslashes() 时要小心,如果您要插入数据库的文本包含 \n 字符,您将看到 "n" 而不是 (看不到) "\n"。

对于 XML 来说应该没有问题,但这仍然很无聊...
Evgeny
16 年前
stripslashes_deep 的扩展版本。这允许在数组键中也去除反斜杠。

function stripslashes_deep($value) {
if (is_array($value)) {
if (count($value)>0) {
$return = array_combine(array_map('stripslashes_deep', array_keys($value)),array_map('stripslashes_deep', array_values($value)));
} else {
$return = array_map('stripslashes_deep', $value);
}
return $return;
} else {
$return = stripslashes($value);
return $return ;
}
}
To Top