web-dev-qa-db-ja.com

ベストプラクティス:PHPで長い複数行の文字列を操作しますか?

注:これが非常に単純な質問である場合は申し訳ありませんが、コードの書式設定にやや強迫観念しています。

メールの本文を構成する文字列を返す関数を持つクラスがあります。このテキストは、電子メールで正しく表示されるように書式設定する必要がありますが、コードがファンキーに見えることもありません。ここに私が意味するものがあります:

class Something
{
    public function getEmailText($vars)
    {
        $text = 'Hello ' . $vars->name . ",

The second line starts two lines below.

I also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
        return $text;
    }
}

ただし、次のように書くこともできます。

public function getEmailText($vars)
{
    $text = "Hello {$vars->name},\n\rThe second line starts two lines below.\n\rI also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
    return $text;
}

しかし、改行とキャリッジリターンはどうなりますか?違いは何ですか? \n\n\r\rまたは\n\rと同等ですか?行間に行のギャップを作成する場合、どちらを使用する必要がありますか?

次に、出力バッファリングとヒアドキュメント構文のオプションがあります。

オブジェクトで長い複数行の文字列をどのように使用しますか?

167
Andrew

HEREDOCまたはNOWDOCを使用する必要があります。

$var = "some text";
$text = <<<EOT
  Place your text between the EOT. It's
  the delimiter that ends the text
  of your multiline string.
  $var
EOT;

HeredocとNowdocの違いは、heredocに埋め込まれたPHPコードが実行されるのに対し、NowdocのPHPコードはそのまま出力されることです。

$var = "foo";
$text = <<<'EOT'
  My $var
EOT;

この場合、$ textの値はMy $varになります。

注:閉じるEOT;の前に、スペースやタブを入れないでください。そうしないと、エラーが発生します

263
halfdan

私はpix0rと同様のシステムを使用しており、それによりコードが非常に読みやすくなると思います。場合によっては、実際に改行を二重引用符で区切って、残りの文字列に単一引用符を使用することもあります。このように、二重引用符で囲まれた文字列内に連結を使用するよりも連結を使用すると、テキストおよび変数の残りの部分からも目立ちます。だから私はあなたの元の例でこのようなことをするかもしれません:

$text = 'Hello ' . $vars->name . ','
      . "\r\n\r\n"
      . 'The second line starts two lines below.'
      . "\r\n\r\n"
      . 'I also don\'t want any spaces before the new line,'
      . ' so it\'s butted up against the left side of the screen.';

return $text;

改行については、電子メールでは常に\ r\nを使用する必要があります。 PHP_EOLは、phpが実行されているのと同じオペレーティングシステムで使用されるファイル用です。

43
Cvuorinen

長いテキストにはテンプレートを使用します:

email-template.txtに含まれるもの

hello {name}!
how are you? 

PHPでこれを行います:

$email = file_get_contents('email-template.txt');
$email = str_replace('{name},', 'Simon', $email);
24
powtac

\nおよび/または\rを文字列の中央に追加し、2番目の例のように非常に長いコード行があると、気分が悪くなります。コードを読むと、結果が表示されず、スクロールします。

この種の状況では、常にHeredocを使用します(またはPHP> = 5.3を使用する場合はNowdoc:書きやすく、読みやすく、超長い行は不要です、...

例えば ​​:

$var = 'World';
$str = <<<MARKER
this is a very
long string that
doesn't require
horizontal scrolling, 
and interpolates variables :
Hello, $var!
MARKER;

ただ一つのこと:エンドマーカー(およびその後の ';')はその行で唯一のものでなければなりません:前後にスペース/タブはありません!

19
Pascal MARTIN

もちろん、HEREDOCを使用することもできますが、コードの読みやすさに関しては、複数行に文字列をラップする最初の例よりも優れているわけではありません。

複数行の文字列をコードの見栄えとフローに合わせて本当に見たい場合は、文字列を次のように連結することをお勧めします。

$text = "Hello, {$vars->name},\r\n\r\n"
    . "The second line starts two lines below.\r\n"
    . ".. Third line... etc";

これは、HEREDOCや複数行の文字列よりも若干遅いかもしれませんが、コードのインデントでうまく流れ、読みやすくなります。

12
pix0r

私はこのメソッドをJavascriptでもう少し気に入っていますが、まだ言及されていないため、ここに含める価値があります。

$var = "pizza";

$text = implode(" ", [
  "I love me some",
  "really large",
  $var,
  "pies.",
]);

// "I love me some really large pizza pies."

小さいものについては、連結された文字列と比較して、配列構造を使用する方が簡単なことがよくあります。

関連: 破裂音と連結性能

8
johnny

それを信じる人

"abc\n" . "def\n"

複数行の文字列が間違っています。これは、複数行の文字列ではなく、連結演算子を使用した2つの文字列です。このような連結された文字列は、たとえば、事前定義された配列のキーとして使用できません。残念ながら、phpは実際の複数行の文字列を

"abc\n"
"def\n"

HEREDOCおよびNOWDOC構文のみ。テンプレートに適しています。ネストされたコードのインデントはこのような構文によって壊れるためです。

1
Dmitriy Sintsov

以下も使用できます。

<?php
ob_start();
echo "some text";
echo "\n";

// you can also use: 
?> 
some text can be also written here, or maybe HTML:
<div>whatever<\div>
<?php
echo "you can basically write whatever you want";
// and then: 
$long_text = ob_get_clean();

0
Alon Gouldman

改行と改行に関する質問について:

クロスプラットフォームの互換性の問題を解決するため、事前定義されたグローバル定数PHP_EOLを使用することをお勧めします。

この質問はSOで事前に提起されており、「 PHP定数PHP_EOL

0
Corey Ballou

しかし、改行とキャリッジリターンはどうなりますか?違いは何ですか?\n\nは\ r\rまたは\ n\rと同等ですか?行間に行のギャップを作成する場合、どちらを使用する必要がありますか?

この質問に実際に答えている人は誰もいなかったので、私はここにいます。

\rは「キャリッジリターン」を表します

\nは「改行」を表します

それらの実際の理由はタイプライターに戻っています。入力すると、「キャリッジ」がタイプライターの右側に文字ごとにゆっくりとスライドします。行の終わりに達したら、キャリッジを返し、次に新しい行に移動します。新しい行に移動するには、をタイプライターに供給したレバーを反転させます。したがって、これらのアクションを組み合わせて、キャリッジリターンラインフィードと呼びました。とても文字通り:

\nという改行は、次の行に移動することを意味します。

キャリッジリターン\rは、カーソルを行の先頭に移動することを意味します。

最終的にHello\n\nWorldは、画面に次の出力を表示するはずです。

Hello

     World

Hello\r\rWorld次の出力 になる場合。

2行の\r\nを組み合わせた場合にのみ、既知の行を一般的に理解できます。 I.E. Hello\r\nWorldの結果は次のとおりです。

Hello
World

そしてもちろん、\n\r\r\nと同じ視覚的出力になります。

もともとコンピューターは、\r\nを文字通り使用していました。しかし、最近では、キャリッジリターンのサポートはまばらです。通常、すべてのシステムで、\nを単独で使用して回避できます。 OSに依存することはありませんが、出力の表示内容に依存します。

それでも、できる限り、\r\nを使用することを常にお勧めします。

0
Sancarn