
`str_getcsv()` 的 `$escape` 参数并不用于“转义分隔符”,而是用于转义 enclosure 内的引号字符;若需让分隔符不生效,应使用 enclosure(如单引号)将含分隔符的字段整体包裹。
PHP 的 str_getcsv() 函数设计遵循 CSV 标准规范:它通过 enclosure(包围符) 来界定字段边界,而 escape(转义符)仅作用于 enclosure 内部的 enclosure 字符本身(例如,当字段中出现单引号时,用反斜杠转义 'O\'Reilly'),它对分隔符(separator)完全无效。
因此,以下调用:
str_getcsv("test\\.a.b", ".", "'", "\\");并不会将 \. 视为“被转义的点号”,从而跳过分隔逻辑——因为 str_getcsv 根本不解析 separator 的转义序列。它只是逐字符扫描:遇到 . 就切分,除非该 . 被 enclosure(如 ')包围。
✅ 正确做法是:将含分隔符的字段用 enclosure 包裹。例如:
立即学习“PHP免费学习笔记(深入)”;
$result = str_getcsv("'test.a'.b", ".", "'", "\\");
var_dump($result);
// 输出:
// array(2) {
// [0] => string(6) "test.a"
// [1] => string(1) "b"
// }⚠️ 注意事项:
- enclosure 字符必须成对出现,且不能嵌套;
- escape 字符仅在 enclosure 内部生效(如 'a\.b' 中的 \. 会被视为字面量 .,但前提是 . 不是 separator;若 . 是 separator,则仍需靠 enclosure 隔离整个字段);
- 若字段本身包含 enclosure 字符(如单引号),需用 escape 字符转义:str_getcsv("'O''Reilly'.book", ".", "'", "'") → ["O'Reilly", "book"](注意此处 escape 设为 ',故两个连续单引号表示一个字面单引号);
- separator 永远无法通过 \. 等方式“局部屏蔽”,这是函数底层解析逻辑决定的,非 bug,而是 CSV 格式语义使然。
? 总结:想让分隔符在某段文本中“失效”,唯一可靠方式是用 enclosure 将其完整包裹;$escape 参数仅服务于 enclosure 内容的引号转义,与 separator 无关。











