【问题标题】:Do I need to escape backslashes in PHP?我需要在 PHP 中转义反斜杠吗?
【发布时间】:2010-08-05 14:26:35
【问题描述】:

我需要在 PHP 中转义反斜杠吗?

echo 'Application\Models\User'; # Prints "Application\Models\User"
echo 'Application\\Models\\User'; # Same output
echo 'Application\Model\'User'; # Gives "Application\Model'User"

所以它是一个转义字符。如果我想引用Application\Models\User,我不需要转义它(\)吗?

【问题讨论】:

    标签: php string escaping


    【解决方案1】:

    single quoted strings 中,仅识别转义序列\\\';任何其他出现的\ 都被解释为普通字符。

    因此,由于 \M\U 不是有效的转义序列,因此它们被按原样解释。

    【讨论】:

    • 但是转义反斜杠本身似乎是可选的,对吧?所以我可以同时写'Hello \world''Hello \\world'。当然,您的回答暗示,因为 \w 不是有效的转义序列,因此按书面形式输出。
    • @caw: 不。它确实在这里工作,但那是 not 因为转义反斜杠是“可选的”,但因为 \w 组合无法匹配任何内容,因此又回到了它的字面形式。但是尝试打印单个 `\`,例如,不转义。或以单个反斜杠结尾的任何内容。你会得到一个解析错误。
    • @Sz 这只是因为单个反斜杠将被解释为以下单引号的转义字符。你是对的,当然。由于您所说的原因,反斜杠的转义通常是可选的,即在大多数其他情况下它将是无效的转义序列,因此被打印为文字反斜杠。
    • @caw,是的,我发表评论的目的只是为了防止这个页面的一些读者带着错误的想法离开,然后回忆起可能是简单的信息,而不是确切的微妙之处(例外) --> 一种在漫长的夜晚创建偷偷摸摸的错误的完美方法(谈论反斜杠,可能在 Windows 后期 PHP 子系统的高风险文件系统级代码中:))。
    【解决方案2】:

    在单引号字符串中,转义反斜杠是可选的,唯一的例外是在单引号或反斜杠之前(因为\'\\ 是转义序列)。

    这在编写正则表达式时很常见,因为它们往往包含反斜杠。 preg_replace('/\w\b/', ' ', $str)/\\w\\b/ 更容易阅读。

    请参阅manual

    【讨论】:

    • 反斜杠必须被转义,如手册和接受的答案中所述。
    • @GrasDouble 不,他们没有。这个答案是正确的。
    • 实际上它们不必被转义,除了一种情况:如果反斜杠是最后一个字符。 'foo\\' 有效,但 'foo\' 无效。我认为非转义的反斜杠应该被视为一种语法糖。为了保持一致性,您可能希望始终避开它们,但这取决于您。
    • @GrasDouble:“逃脱了,除了一种情况”,好吧,没有。 :) Artefacto 在那个特定点(仅)是正确的,它也需要在单引号之前进行转义。
    • 所以,回顾一下:它不是可选的,因此答案是不正确的。大多数时候,我们基本上只是“幸运”。正如@GrasDouble 正确揭示的那样,答案中提到的异常(“在单引号之前”)甚至不是唯一的。
    【解决方案3】:

    由于您的最后一个示例包含引号 ('),因此您需要使用 addslashes 函数转义此类字符串,或者只需在其前面添加一个斜线,如下所示:

    'Application\Model\\'User'
    

    【讨论】:

      【解决方案4】:

      您将在此处找到完整的说明: http://nl.php.net/manual/en/language.types.string.php

      【讨论】:

      • 特别是什么?你能引用一个报价吗?
      【解决方案5】:

      我认为这取决于上下文,但如果在文件路径中使用反斜杠,最好避开反斜杠。

      另一个好主意是将目录分隔符分配给一个常量,这是我之前在各种应用程序中看到的,并这样使用它:

      <?php
      define('DIRECTORY_SEPARATOR', '\\');
      
      echo 'Application'.DIRECTORY_SEPARATOR . 'Models' . DIRECTORY_SEPARATOR . 'User';
      ?>
      

      如果您希望节省空间和打字,其他人使用DS 作为常量名称。

      <?php
      define('DS', '\\');
      
      echo 'Application'.DS.'Models'.DS.'User';
      ?>
      

      如果您从 Windows 环境迁移到 *nix 环境,这会使您的应用程序保持可移植性,因为您可以简单地将目录分隔符常量更改为正斜杠。

      【讨论】:

      • DIRECTORY_SEPARATOR 是一个预定义的 PHP 常量,因此您不能(也不想)重新定义它。
      【解决方案6】:

      如果要在 HTML 页面中使用,那么不妨使用 HTML 字符代码 \ 来表示反斜杠,如下所示:

      echo 'Application&#92;Models&#92;User';
      

      它将打印:

      应用\模型\用户

      参考:

      【讨论】:

      • 什么样的代码?它没有名字吗?
      • 谢谢你,@PeterMortensen。不清楚我在谈论 HTML 字符代码。已添加参考。
      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 2013-11-10
      • 2011-03-23
      • 1970-01-01
      相关资源
      最近更新 更多