2013-02-26 17 views
6

MySQLデータベースから既存のデータを、ルビーコマンドにエクスポートしようとしています。rake db:seedで実行できます。PHPでsprintfを使用するときに改行記号を追加する

ここに私のコードです。

# 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改行記号があることに注目してください。私はそれが改行を使うために必要なことすべてをオンラインで読んだ。私は私の改行挿入後、それ自身の行になるように各呼び出しを希望

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 

私のコードの出力は、上記(vertabim、長いライン)です。私が間違っていることに関する提案はありますか?

答えて

22

改行記号\nは、ダブルの引用符で囲まれた場合にのみ解釈されます。"。そのような:

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

また、それは、複数のオペレーティングシステム上の異なるシステム改行区切り文字が含まれている定数であるPHP_EOLについて知っている必要があります。たとえば、Linuxでは\n、Windowsでは\r\nとなります。最もポータブルなコードは次のようになります。

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

二重引用符は、仕事をする\ための必須のn(または\ tのような任意の他のwhitescpaceの文字)です。

+1

文字列構文が正しくありません([so]の構文の強調表示のために表示されます)。文字列の中の二重引用符*をエスケープする必要があります。 – Veger

+1

速かったです。それを編集しました。私は彼がバールからデータをマークアウトするために単に引用符を使用したと仮定しているので、それらを一重引用符に変更しました(二重引用符をエスケープすることも別の可能性です)。 –

2

それは二重引用符( ")で囲まれている時に、文字列内の特殊文字のみ動作します。詳細についてはPHP string documentationを参照してください。

だから、どちらかが非常に使いとして多くの仕事である、二重引用符を使用します数だけでなく、あなたの文字列内の二重引用符と文字列内のすべての二重引用符をエスケープ

それとも、怠惰であれば、その後に新しい行を連結します。

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

あなたはシングル、ダブル引用符で囲まれた文字列を、使用する必要があります引用されたものは電子メールではありませんxpand特殊文字シーケンス。 PHP文字列の詳細についてはthe manualをご覧ください。

+0

ありがとう! – Jonathan

11

あなたは二重引用符に切り替え、あなたが使用して改行を挿入することができます(あるいはしたくない)ことができない場合はそのようなASCIIコード:

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

%cは、あなたが任意のASCIIコードを挿入することができますし、 10は改行のコードです。

1

ジョシュの答えに続いて、%s printf('something%s', "\n")を使って、補間された文字列からnewlineをprintfに挿入することができます。文字列テンプレートが言語変数に格納されている場合や、複数の置換を行っている場合、またはPHBが強制するためsprintfに固執する必要がある場合のみです。あなたのケースでは

それは、私は、このように電子メールのヘッダブロックをフォーマットしました

$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になります。余分な文字は使用しませんが、読みにくいです!

関連する問題