trim()可精准去除字符串首尾单双引号,语义清晰、性能好;需显式传参如trim($str, '"''),不误删中间引号,但不支持成对校验或多字节引号。

用 trim() 去掉字符串首尾的单引号或双引号
直接调用 trim() 并指定引号字符即可,它默认只处理首尾,不会误删中间的引号。注意必须显式传入引号字符,否则默认只会去掉空白符。
-
trim($str, '"')—— 只去首尾双引号 -
trim($str, "'")—— 只去首尾单引号 -
trim($str, ""'")—— 同时支持单双引号(顺序无关)
比如:$str = '"hello"'; echo trim($str, '"'); 输出 hello;$str = "'"nested"'"; echo trim($str, ""'"); 输出 "nested" —— 中间的引号完全保留。
为什么不用 str_replace() 或正则
str_replace() 会全局替换,str_replace(['"', "'"], '', $str) 可能把中间的引号也干掉;正则如 preg_replace('/^["']|["']$/', '', $str) 虽然可行,但写法冗长、可读性差,且容易漏掉转义或边界情况(比如字符串只有单个引号)。trim() 语义清晰、性能好、无副作用。
- 当输入是
'"abc"'(外单内双),trim($str, ""'")正确得到"abc" - 若误用
str_replace(),可能变成abc,破坏原意 -
trim()对空字符串、null、非字符串输入较敏感,建议先is_string()判断
处理 JSON 字符串或用户输入时的额外注意
如果字符串来自 $_POST 或 JSON 解析后又被手动加了引号(比如前端传了 ""value"" 这种嵌套格式),trim() 只能剥一层。这时候得看来源:JSON 应该用 json_decode() 解析,而不是手动去引号;用户表单输入若被框架自动加了引号(极少见),要查清中间层逻辑。
- 不要对
json_decode($str)的结果再用trim()去引号——它返回的是 PHP 原生类型,不是带引号的字符串 - 若字符串是
'"foo\nbar"'(含转义),trim()照常工作,不解析转义 - 多字节引号(如中文全角引号)需单独处理,
trim()不支持,得用mb_substr()+ 判断首尾
兼容性与边界情况
trim() 自 PHP 4 起就存在,无版本顾虑。但要注意:它会同时去掉首尾所有匹配字符,不是“配对去除”。比如 trim('"""abc"', '"') 得到 abc,而 trim('"a"b"c"', '"') 得到 a"b"c —— 因为首尾各只有一个引号被剥掉。
- 如果业务要求严格“成对引号才去除”,就得手写判断:
if ($str[0] === '"' && $str[-1] === '"') { $str = substr($str, 1, -1); } -
trim()对

