PHP字符串连接和换行

时间:2015-09-06 00:44:34

标签: php string

我需要一些帮助来理解一些对我没有意义的PHP行为,提前感谢您的帮助。

首先,使用\r\n\n\r之间有区别吗?我认为逻辑上没有,但我认为必须有一个实际的原因,为什么它们单独列在PHP文档中。我目前正在使用\r\n,但有时我会换行,有时我不会,它会让人迷惑。

其次,我知道如果我在浏览器中回显信息,我会使用nl2br()函数,但我没有向浏览器显示信息,它正在被收集并连接成一个字符串然后通过mail()发送,这就是出现视觉差异的地方。

以下是剧本,非常简单,没有什么可以令人难以置信的:

<?php
    $browser = $_SERVER['HTTP_USER_AGENT'];
    $page = $_SERVER['PHP_SELF'];
    $ip = $_SERVER['REMOTE_ADDR'];
    $host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
    $from_page = $_SERVER['HTTP_REFERER'];
    $time = date('l, F jS Y - g:i:s A', $_SERVER['REQUEST_TIME']);
    $uri = $_SERVER['SCRIPT_URI'];

    $to = "***";
    $subject = "Visitor Log";
    $message = "IP Address : " . $ip . " ( HOST: " . $host . " )\r\n" . "Browser : " . $browser . "\r\n" . "From : " . $from_page . "\r\n" . "Page : " . $page . "\r\n" . "Time : " . $time . "\r\n" . "Script : " . $uri;
    $headers = "From: ***" . "\r\n" . "Reply-To: ***" . "\r\n" . "X-Mailer: PHP/" . phpversion();
    mail($to,$subject,$message,$headers);
?>

但正如您所看到的,我将换行符填充到$message中,以便我收到的电子邮件具有明显的可读性。但有时电子邮件会到达并且所有内容都应该在一个单独的行上,有时它不会。所以我想也许添加换行符的方法不是最好的,而且我做错了。

所以问题是,我应该使用什么来获得正确的换行符,如果我使用的是不正确的,如果它是正确的,为什么它不能始终有效?我非常感谢您的帮助以增加一些清晰度。

如果重要或有所作为,我将使用PHP 5(5.5.28)Linux服务器与Apache。

更新的答案

感谢大家的帮助,但最终我最终将其修改如下,甚至添加了内容类型以便进行测量(TY @TOM)。

<?php
    $browser = $_SERVER['HTTP_USER_AGENT'];
    $page = $_SERVER['PHP_SELF'];
    $ip = $_SERVER['REMOTE_ADDR'];
    $host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
    $from_page = $_SERVER['HTTP_REFERER'];
    $time = date('l, F jS Y - g:i:s A', $_SERVER['REQUEST_TIME']);
    $uri = $_SERVER['SCRIPT_URI'];

    $to = "***";
    $subject = "Visitor Log";
    $message = "IP Address : " . $ip . " ( HOST: " . $host . " )" . "\r\n";
    $message .= "Browser : " . $browser . "\r\n";
    $message .= "From : " . $from_page . "\r\n";
    $message .= "Page : " . $page . "\r\n";
    $message .= "Time : " . $time . "\r\n";
    $message .= "Script : " . $uri;
    $headers = "From: ***" . "\r\n";
    $headers .= "Reply-To: ***" . "\r\n";
    $headers .= "X-Mailer: PHP/" . phpversion() . "\r\n";
    $headers .= "Content-Type: text/html; charset=\"utf-8\"" . "\r\n";

    mail($to,$subject,nl2br($message),nl2br($headers));
?>

注意:新格式不是解决方案的一部分,仅适用于我自己。解决方案放弃了简单并使用html并使用nl2br函数来强制休息,而不是优雅,而不是我想要的完全但是有效。

2 个答案:

答案 0 :(得分:1)

我最好的猜测是你有时以text / ht格式发送,有时以text / html格式发送..(因为你没有指定任何东西,也许是mail()或邮件服务器或客户端最好的猜测?你可以调查..)

我会尝试强制它以text / html格式发送并使用

<br/>

使用nl2br,或强制它为text / plain并使用\ n

像...

$message = "IP Address : " . $ip . " ( HOST: " . $host . " )\r\n" . 'Content-Type: text/html; charset="utf-8"'."\r\n"."Browser : " . $browser . "\r\n" . "From : " . $from_page . "\r\n" . "Page : " . $page . "\r\n" . "Time : " . $time . "\r\n" . "Script : " . $uri;

..如果你强迫它以html的形式邮寄,我不确定标题

答案 1 :(得分:1)

问题是您没有在电子邮件标题中传递content-type,因此电子邮件客户端可能会将其解释为plain-texttext/html,具体取决于供应商。最好的方法是在电子邮件标题中传递content-type参数。

  • content-type:text/plain\n作为换行符
  • content-type:text/html</br>作为换行符