注意:如果这是一个非常简单的问题,我很抱歉,但我对代码的格式化有点强迫。
我有一个类,其函数返回一个字符串,该字符串将构成电子邮件的正文。我希望这个文本格式化,因此它在电子邮件中看起来正确,但也因此它不会使我的代码看起来很时髦。这就是我的意思:
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
?当我在线之间创建线间隙时,我应该使用哪个?
然后可以选择输出缓冲和heredoc语法。
如何处理在对象中使用长多行字符串?
答案 0 :(得分:263)
您应该使用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;
之前,不应有空格或制表符。否则你会收到错误
答案 1 :(得分:43)
我使用类似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的同一操作系统中使用的文件。
答案 2 :(得分:24)
我使用长文本模板:
email-template.txt包含
hello {name}!
how are you?
在PHP中我这样做:
$email = file_get_contents('email-template.txt');
$email = str_replace('{name},', 'Simon', $email);
答案 3 :(得分:19)
在字符串中间添加\n
和/或\r
,并且有一长串代码,如第二个示例中所示,感觉不对:当您阅读代码时,你没有看到结果,你必须滚动。
在这种情况下,我总是使用Heredoc (或者Nowdoc,如果使用PHP&gt; = 5.3):易于编写,易于阅读,不需要超长行,。 ..
例如:
$var = 'World';
$str = <<<MARKER
this is a very
long string that
doesn't require
horizontal scrolling,
and interpolates variables :
Hello, $var!
MARKER;
只有一件事:结束标记(以及之后的';
')必须是其唯一的内容:前后没有空格/标签!
答案 4 :(得分:12)
当然,您可以使用HEREDOC,但就代码可读性而言,它并不比第一个示例更好,将字符串包装在多行中。
如果你真的希望你的多行字符串看起来很好并且你的代码很好用,我建议你把这些字符串连接在一起:
$text = "Hello, {$vars->name},\r\n\r\n"
. "The second line starts two lines below.\r\n"
. ".. Third line... etc";
这可能比HEREDOC或多行字符串略慢,但它会随着代码的缩进而流动,并且更容易阅读。
答案 5 :(得分:8)
我更喜欢Javascript的这种方法,但它似乎值得包括在这里,因为它还没有被提及。
$var = "pizza";
$text = implode(" ", [
"I love me some",
"really large",
$var,
"pies.",
]);
// "I love me some really large pizza pies."
对于较小的东西,我发现与串联字符串相比,使用数组结构通常更容易。
答案 6 :(得分:1)
相信
的人"abc\n" . "def\n"
是多行字符串错误。这是带有连接运算符的两个字符串,而不是多行字符串。例如,这种连接的字符串不能用作预定义数组的键。不幸的是,php没有以
的形式提供真正的多行字符串"abc\n"
"def\n"
仅HEREDOC
和NOWDOC
语法,它更适合模板,因为嵌套代码缩进被这种语法所破坏。
答案 7 :(得分:0)
关于你有关换行和回车的问题:
我建议使用预定义的全局常量 PHP_EOL ,因为它可以解决任何跨平台兼容性问题。
此问题已事先在SO上提出,您可以通过阅读“When do I use the PHP constant PHP_EOL”了解更多信息
答案 8 :(得分:0)
但新线和回车的交易是什么?有什么不同? \ n \ n等于\ r \ n \ n或\ n \ r?当我在线之间创建线间隙时,我应该使用哪个?
这里似乎没有人真正回答这个问题,所以我在这里。
\r
代表'回车'
\n
代表'换行'
他们的实际原因可以追溯到打字机。当您输入“马车”时,将逐字符地逐字滑动到打字机的右侧。当你到达终点时,你会返回马车,然后转到新行。要转到新行,您可以将输入行的操纵杆翻转到类型编写器。因此,这些行动合并后称为回车换行。所以非常字面意思:
换行符\n
表示移至下一行。
回车符\r
表示将光标移动到行的开头。
最终Hello\n\nWorld
应该会在屏幕上显示以下输出:
Hello
World
Hello\r\rWorld
应该导致the following output。
只有在组合2个字符\r\n
时才能对知道线有共同的理解。 I.E. Hello\r\nWorld
应导致:
Hello
World
当然\n\r
会产生与\r\n
相同的视觉输出。
最初计算机完全按照\r
和\n
计算。然而,如今对回车的支持很少。通常在每个系统上,您都可以自行使用\n
。它从不依赖于操作系统,但它取决于您正在查看输出的内容。
我总是建议尽可能使用\r\n
!
答案 9 :(得分:0)
您还可以使用:
<?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();