stripslashes()仅还原反斜杠转义序列(如'→'、"→"、→),不处理 等控制符;它专为撤销addslashes()而设,对数组需递归调用,现代开发应优先使用预处理语句而非此函数。

stripslashes 会把哪些字符还原
stripslashes() 只处理反斜杠()开头的转义序列,比如 ' → '、" → "、\ → 。它不会碰
、 、
这类“真正”的转义控制符——这些是 PHP 字符串解析阶段就生效的,stripslashes() 根本看不到它们。
常见误解是以为它能“去掉所有转义”,其实它只负责 undo addslashes() 做的事。如果你看到字符串里有 \'Hello\',stripslashes() 会变成 'Hello'(只去一层),不是直接变 'Hello'。
什么时候必须用 stripslashes
典型场景是读取旧系统中被 addslashes() 处理过、又没进数据库直接存成文本的数据,或者从某些老 CMS 导出的字段值里带了冗余反斜杠。
- 不推荐用于现代代码:PDO/MySQLi 预处理语句 +
htmlspecialchars()输出,根本不需要addslashes()/stripslashes() - 别对
$_POST或$_GET直接调用:PHP 5.4+ 已移除 magic_quotes_gpc,这些超全局变量不再自动转义 - 如果数据来自
mysqli_real_escape_string()或 PDO 的quote(),也不能用stripslashes()还原——那是 SQL 层转义,和它无关
对数组或嵌套结构要自己递归
stripslashes() 本身不支持数组,传进去会警告并返回 null。遇到 $_POST 表单含多维字段(如 user[name]、files[0][path]),得手动递归处理。
最简安全写法:
function stripslashes_deep($value) {
return is_array($value)
? array_map('stripslashes_deep', $value)
: stripslashes($value);
}
$data = stripslashes_deep($_POST);
注意:array_map() 在遇到 null 或资源类型时可能出错,生产环境建议加 is_string() 判断再调用 stripslashes()。
比 stripslashes 更常见的其实是误用
很多人看到输出里多了反斜杠,第一反应就是加 stripslashes(),结果越套越多。真实原因往往是:
- 前端 JS 用
JSON.stringify()后没JSON.parse()就直接显示,导致"name":"O'Reilly"被当纯文本渲染 - 数据库字段用了
TEXT但内容实际是 JSON,PHPjson_decode()前忘了stripslashes()—— 这种情况才真需要它 - CI 框架早期版本自动对输入做转义,升级后残留逻辑没清理,
stripslashes()成了补丁式存在
真正难处理的,从来不是函数怎么写,而是你得先确认那串反斜杠到底是谁加的、加在哪个环节、该不该被去掉。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











