【问题标题】:Adding a \n newline symbol when using sprintf in PHP在 PHP 中使用 sprintf 时添加 \n 换行符
【发布时间】:2013-02-12 01:32:26
【问题描述】:

我正在尝试将现有数据从 MySQL 数据库导出到可以使用 rake db:seed 运行的 ruby​​ 命令中。

这是我的代码。

# Generate db:seed data for proveedores.
$proveedores = R::findAll('tbproveedores');
$proveedoresE = R::exportAll($proveedores);

foreach ($proveedoresE as &$p) {

    $line = 'BookSupplier.create(company: "%s", city: "%s", country: "%s", address: "%s", telephone: "%s", contact: "%s", email: "%s", website: "%s"\n';
    $exportedLine = sprintf($line, $p['empresa'], $p['ciudad'], $p['pais'], $p['direccion'], $p['telefono'], $p['personacontacto'], $p['email'], $p['website']);
    var_dump($exportedLine);
    fwrite($seeds, $exportedLine);
    echo "<br />";
}

注意 $line 变量末尾的 \n 换行符。我在网上看到,这就是使用换行符所需要的全部内容。

我上面代码的输出是(vertabim, a long line):

BookSupplier.create(company: "Pearson", city: "Lima", country: "Peru", address: "Av. Limon", telephone: "4673535421", contact: "Javier", email: "", website: ""\nBookSupplier.create(company: "Project Management Institute - PMI", city: "Pennsylvania", country: "Estados Unidos", address: "Newtown Square, Pennsylvania", telephone: "1", contact: "Limberg Morales", email: "", website: "http://www.pmi.org/"\nBookSupplier.create(company: "UVirtual - Centro de Excelencia", city: "Santa Cruz", country: "Bolivia", address: "Av. Irala 585", telephone: "1", contact: "Limberg Morales", email: "", website: ""\nBookSupplier.create(company: "Ábaco de Rodolfo Depalma", city: "Buenos Aires", country: "Argentina", address: "Viamonte 1336, 4° (C1053 ACB) Buenos Aires", telephone: "5411-43711675", contact: "Limberg Morales", email: "", website: "http://www.abacoeditorial.com.ar/"\nBookSupplier.create(company: "Pablo Lledó - ProjectManagement", city: "Canadá", country: "Estados Unidos", address: "Victoria, BC, Canadá", telephone: "1", contact: "Limberg Morales", email: "", website: ""\n

我希望每个调用都在自己的行中,在我插入换行符之后。关于我做错了什么有什么建议吗?

【问题讨论】:

    标签: php newline printf


    【解决方案1】:

    换行符\n 仅在被引号括起来时才会被解释:"。像这样:

    $line  = '...............';
    $line .= "\n";
    

    您还应该了解PHP_EOL,它是一个常量,包含系统换行符,在多个操作系统上是不同的。例如,在 Linux 上为 \n,在 Windows 上为 \r\n。最便携的代码如下所示:

    $line  = '.....';
    $line .= PHP_EOL;
    

    【讨论】:

      【解决方案2】:
      $line = "BookSupplier.create(company: '%s', city: '%s', country: '%s', address: '%s', telephone: '%s', contact: '%s', email: '%s', website: '%s'\n";
      

      双引号对于 \n(或任何其他 whitescpace char 如 \t)是必需的。

      【讨论】:

      • 您的字符串语法不正确(由于Stack Overflow 的语法突出显示,它甚至可见)。您需要将双引号 inside 转义。
      • 要快.. 编辑它。我认为他使用引号只是为了标记变量中的数据,因此将它们更改为单引号(转义双引号是另一种可能性)。
      【解决方案3】:

      字符串中的特殊字符仅在用双引号 (") 括起来时才有效。有关详细信息,请参阅PHP string documentation

      所以要么使用双引号,这需要大量的工作,因为你在字符串中也使用了很多双引号。并转义字符串内的所有双引号。

      或者如果你很懒,在之后连接新行:

      $line = '...';
      $line .= "\n";
      

      【讨论】:

        【解决方案4】:

        您需要使用双引号字符串,单引号不扩展特殊字符序列。查看the manual 了解有关 PHP 字符串的更多详细信息。

        【讨论】:

          【解决方案5】:

          如果您不能(或不想)切换到双引号,您可以使用 ASCII 代码插入换行符,如下所示:

          > php
          <?php printf('line one%cline two', 10);^D
          line one
          line two
          >
          

          %c 允许您插入任何 ASCII 代码,而 10 是换行符的代码。

          【讨论】:

          • 虽然是一个神奇的数字(种类),但我更喜欢这个解决方案
          • 或者更好printf('line one%sline two', PHP_EOL);
          【解决方案6】:

          从 Josh 的回答开始,您可以使用 %s printf('something%s', "\n") 将插入字符串中的换行符注入 printf 中,这在更复杂的示例中开始变得更有意义 - 例如如果字符串模板存储在语言变量中,或者您正在进行多次替换,或者只需要坚持使用 sprintf,因为您的 PHB 要求它。

          在你的情况下是

          $line = 'BookSupplier.create(company: "%s", city: "%s", country: "%s", address: "%s", telephone: "%s", contact: "%s", email: "%s", website: "%s"%s';
          $exportedLine = sprintf($line, $p['empresa'], $p['ciudad'], $p['pais'], $p['direccion'], $p['telefono'], $p['personacontacto'], $p['email'], $p['website'], "\n");
          

          我已经格式化了一个电子邮件标题块:

          $headers = sprintf(
              'From: %1$s%2$sReply-To: %1$s%2$sMIME-Version: 1.0%2$sContent-type: text/html; charset=iso-8859-1%2$s'
              , $EMAIL_FROM, "\r\n");
          

          使用1$ 参数索引语法重复使用\r\n

          所以%2$s 变成了新的\r\n,不会占用任何额外的字符但更难阅读!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-22
            • 2016-08-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多