【问题标题】:Do (back-slashes in) paths need to be escaped?是否需要转义(反斜杠)路径?
【发布时间】:2013-12-05 11:15:15
【问题描述】:

在程序或脚本的代码中,必须将文件或目录的路径放在字符串中并不少见。这通常不是 *nix 系统上的路径的问题,因为它们使用正斜杠,在大多数语言中通常不需要转义,但 Windows 使用反斜杠作为通常 do 需要的路径在大多数语言中都进行了转义。

使用 C(++),您通常 确实 必须转义字符串中路径的斜杠,因为如果您不这样做,大多数编译器都会发出警告,但我看过其他代码,尤其是 PHP 脚本,它们 not 转义它们。例如,我见过无数的配置文件示例包含类似这样的行:

static $storageDir = 'C:\webgrind\tmp';

表面上你必须避开这样的路径,我确实考虑过它们可能是由没有实际使用 Windows 的人编写的,只是将配置数据从 Linux 外推到 Windows 而不进行实际测试,但如果是这样的话,那么代码应该失败,但它似乎经常工作。

那么你必须在代码中转义字符串中的路径吗?我问的主要是 PHP,因为这是我个人看到这种情况发生最多的地方,但我也愿意接受其他/普遍的答案。

【问题讨论】:

  • 我确信我也曾在双引号字符串中看到过它们。我会留意并在下次看到问题时更新问题。

标签: php string path escaping backslash


【解决方案1】:

PHP 中的单引号字符串不需要双重转义。与双引号字符串不同,单数反斜杠后面的小写字母可能会造成麻烦。

但是在单引号字符串中,反斜杠仍然可以自行转义

'abc\\abc' == 'abc\abc'

【讨论】:

    【解决方案2】:

    特别是谈到路径,正斜杠也可以

    'C:/webgrind/tmp'
    

    【讨论】:

      【解决方案3】:

      单引号禁止除\\\' 之外的所有转义序列,因此无需转义其中的反斜杠,除非它作为字符串文字中的最后一个字符出现。

      【讨论】:

      • 如果恰好是字符串的最后一个字符,你仍然需要转义
      • @YourCommonSense:已修复。
      • 嗯,在发布问题之前,我尝试查找答案,部分搜索包括检查 PHP 是否以不同方式处理单引号和双引号字符串(我知道某些语言会这样做),我读到了才不是。我刚刚再次检查并在 PHP 文档中找到了一个页面(与我之前查看的相同?)支持你们所说的。我不知道发生了什么(矩阵中的故障?),但这个答案是有道理的(至少对于 PHP 而言)。也就是说,我确信我也看到了双引号中未转义的路径,但在我找到示例之前,我会接受这个作为解释。
      • @Synetech:您可以在双引号中使用未转义的路径只要您从未形成转义序列
      • 我不知道……这似乎是有风险的;但即便如此,你不应该收到invalid escape sequence 警告吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      相关资源
      最近更新 更多