在PHP中使用sprintf时添加\ n换行符号

时间:2013-02-26 14:38:59

标签: php newline printf

我正在尝试将现有数据从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,一条长行):

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

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

6 个答案:

答案 0 :(得分:28)

换行符号\n仅在 double 引号中包含时才会被解释:"。像那样:

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

您还应该知道PHP_EOL它是一个包含系统换行符分隔符的常量,它在几个操作系统上是不同的。例如,它在Linux上为\n,在Windows上为\r\n。最便携的代码看起来像:

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

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

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

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

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

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

答案 4 :(得分:1)

根据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");

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

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

答案 5 :(得分:0)

$line = "BookSupplier.create(company: '%s', city: '%s', country: '%s', address: '%s', telephone: '%s', contact: '%s', email: '%s', website: '%s'\n";

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