PHP - วิธีสร้างอักขระขึ้นบรรทัดใหม่ได้อย่างไร


405

ใน PHP ฉันพยายามสร้างอักขระขึ้นบรรทัดใหม่:

echo $clientid;
echo ' ';
echo $lastname;
echo ' ';
echo '\r\n';

หลังจากนั้นฉันเปิดไฟล์ที่สร้างขึ้นใน Notepad และมันเขียนบรรทัดใหม่ตามตัวอักษร:

1 John Doe \ r \ n 1 John Doe \ r \ n 1 John Doe \ r \ n

ฉันได้ลองใช้หลายรูปแบบ\r\nแล้ว แต่ก็ไม่ได้ผล เหตุใดการขึ้นบรรทัดใหม่จึงไม่ใช่การขึ้นบรรทัดใหม่


คำตอบ:


638

เฉพาะสตริงที่ยกมาสองเท่าเท่านั้นที่ตีความลำดับ escape \rและ\nเป็น '0x0D' และ '0x0A' ตามลำดับดังนั้นคุณต้องการ:

"\r\n"

สตริงที่ยกมาเพียงครั้งเดียวในมืออื่น ๆ เท่านั้นที่รู้ลำดับหนีและ\\\'

ดังนั้นหากคุณเชื่อมสตริงที่ยกมาเดี่ยวกับการแบ่งบรรทัดที่สร้างขึ้นที่อื่น (เช่นการใช้สตริงที่ยกมาสองครั้ง"\r\n"หรือการใช้chrฟังก์ชั่น chr(0x0D).chr(0x0A) ) วิธีเดียวที่จะมีการแบ่งบรรทัดภายในสตริงที่ยกมาเดียวคือ

$s = 'some text before the line break
some text after';

ตรวจสอบให้แน่ใจว่าได้ตรวจสอบการแก้ไขการตั้งค่าตัวแบ่งบรรทัดหากคุณต้องการลำดับอักขระเฉพาะ ( \r\nตัวอย่าง)


1
@Pacerier วิธีเดียวที่จะมีการขึ้นบรรทัดใหม่และอักขระขึ้นบรรทัดใหม่ในสตริงที่ยกมาเดียวคือการป้อนอักขระโดยตรงผ่านแป้นพิมพ์ (กด Enter ขึ้นอยู่กับการตั้งค่าบรรณาธิการของคุณในการสิ้นสุดบรรทัด) มิฉะนั้นเพียงใช้การต่อสตริง
Gumbo

1
@Gumbo: คุณกำลังพูดถึงสตริงที่ยกมาเดี่ยวในทางกลับกันเพียงรู้ลำดับการหลบหนี \\ และ \ ' แต่ฉันเพิ่งพิมพ์บรรทัดที่มี echo เป็น <? php echo 'คุณกำลังใช้ Internet Explorer <br>'; echo 'เพิ่มบรรทัดใหม่'; ?> และเห็นผลลัพธ์ในเบราว์เซอร์ มันเพิ่มบรรทัดใหม่ระหว่างสองสายที่ฉันแสดง หมายความว่าอักขระที่เป็นหรือ <br/> ได้รับการขยายในสตริงที่ยกมาเดี่ยว มีอักขระ HTML อื่น ๆ นอกเหนือจากสามตัวนี้ที่ PHP สามารถเข้าใจได้ภายในสตริงที่ยกมาเดี่ยวหรือไม่? ฉันขอให้คุณอัปเดตคำตอบของคุณตามนั้น ขอบคุณ.
PHPFan

1
@ user2839497 สิ่งที่คุณพูดไม่สมเหตุสมผล ไม่มีบริบทเบราว์เซอร์ที่นี่ และแน่นอนว่าเบราว์เซอร์จะแสดงบรรทัดใหม่เมื่อพบ <br/> และแน่นอนว่าไม่มีอะไรที่ป้องกันคุณจากการเพิ่ม '<br/>' ในสตริงที่ยกมา แต่นั่นไม่ได้สร้างบรรทัดใหม่ในไฟล์ข้อความธรรมดา
Fencer

1
@Pacerier สำหรับนโยบายใบเสนอราคาเดียวแทนที่จะใช้การแบ่งบรรทัดในเครื่องมือแก้ไขเช่น Gumbo ที่แนะนำในความคิดเห็นของเขาคุณสามารถใช้โซลูชันอื่นในคำตอบของ Gumbos ตัวอย่างเช่น: 'แสดง newline'.chr (0x0A)' ในสตริงที่ยกมาเดี่ยว '
Fencer

2
คุณควรใช้PHP_EOLแทน
kurdtpage

234

ใช้PHP_EOLค่าคงที่ที่กำหนดไว้ล่วงหน้า:

echo $clientid, ' ', $lastname, PHP_EOL;

ค่าคงที่จะถูกตั้งค่าตามการสิ้นสุดบรรทัดของระบบปฏิบัติการที่ PHP กำลังดำเนินการ บน Linux มันจะเป็น"\n"; บน Windows, "\r\n"มันจะเป็น


96

คำสั่ง "echo" ใน PHP ส่งเอาต์พุตไปยังเบราว์เซอร์เป็น html แบบ raw ดังนั้นแม้ว่าในเครื่องหมายคำพูดคู่เบราว์เซอร์จะไม่แยกมันออกเป็นสองบรรทัดเพราะอักขระขึ้นบรรทัดใหม่ใน HTML ไม่มีความหมายอะไรเลย นั่นเป็นเหตุผลที่คุณต้องใช้อย่างใดอย่างหนึ่ง:

echo [output text]."<br>";

เมื่อใช้ "echo" หรือใช้ fwrite แทน ...

fwrite([output text]."\n");

สิ่งนี้จะออกบรรทัดใหม่ HTML แทน "\ n"


4
ด้วยวิธีการถามคำถามมีแนวโน้มว่าเขาจะส่งออกข้อมูลนี้ไปยังกล่องข้อความหรือจาวาสคริปต์ ฯลฯ สำหรับการแยกวิเคราะห์หรือการอ่านข้อความธรรมดาไม่ให้แสดงเป็น HTML
PC3TJ

43

ใช้ PHP_EOL คงที่เพื่อให้ได้ตัวละครที่เหมาะสมไม่ว่าจะเป็นแพลตฟอร์มใด

http://us3.php.net/manual/en/reserved.constants.php

ตัวอย่างการใช้งานง่าย:

<?php
$data = 'First line' . PHP_EOL .
        'Second line' . PHP_EOL .
        'Third line';

file_put_contents("filename.txt", $data);
?>

23

สตริงระหว่างการ""แก้ไขอัญประกาศคู่หมายความว่าพวกมันแปลงอักขระที่หลีกเลี่ยงเป็นอักขระที่พิมพ์ได้

สตริงระหว่างเครื่องหมายคำพูดเดี่ยว''เป็นตัวอักษรซึ่งหมายความว่าพวกมันจะได้รับการปฏิบัติเหมือนกับที่พิมพ์อักขระ

คุณสามารถมีทั้งคู่ในบรรทัดเดียวกัน:

echo '$clientid $lastname ' . "\r\n";
echo "$clientid $lastname \r\n";

เอาท์พุท:

$clientid $lastname
1 John Doe

คำอธิบายของคุณเกี่ยวกับสัญกรณ์สตริงชนิดต่าง ๆ ใน PHP นั้นใช้ได้เนื่องจากมันแสดงข้อผิดพลาดของผู้เขียนคำถาม แต่ตัวอย่างโค้ดของคุณจะไม่สร้างผลลัพธ์ที่คาดหวังเนื่องจากตัวแปรจะถูกใช้ในสตริงที่ยกมาเดี่ยวและดังที่คุณกล่าวถึงพวกมันจะไม่ถูกสอดแทรก!
Damien Flament

@ Damien Flament นั่นคือสิ่งที่ฉันพูด - เนื้อหาระหว่างคำพูดเดี่ยวไม่ได้ถูกแก้ไข แต่เนื้อหาระหว่างคำพูดคู่นั้น บางทีตัวอย่างของฉันอาจสับสนเพราะคุณคาดหวังว่าจะเห็นเนื้อหาของ $ clientid และ $ lastname แทนที่จะเป็นตัวอักษร "$ clientid" และ "$ lastname" ฉันคิดว่านี่เป็นส่วนหัวของตารางที่ฉันใช้ระหว่างการดีบัก บรรทัดต่อไปนี้น่าจะเป็นecho "$clientid $lastname\r\n"
Kevin S. Miller

เมื่อเขียน "ผลลัพธ์ที่คาดหวัง" ฉันกำลังพูดถึงผลลัพธ์ที่ผู้เขียนคำถามคาดหวังไว้ในคำถาม การเพิ่มรหัสที่แสดงในความคิดเห็นของคุณในคำตอบและการแสดงผลลัพธ์อาจช่วยปรับปรุงคุณภาพคำตอบของคุณ
Damien Flament


13

ที่จริงแล้ว\r\nสำหรับด้าน html ของเอาท์พุท ด้วยตัวอักษรเหล่านั้นคุณสามารถสร้างบรรทัดใหม่ในรหัส html เพื่อให้อ่านง่ายขึ้น:

echo "<html>First line \r\n Second line</html>";

จะส่งออก:

<html>First line
Second line</html>

ที่ดูหน้าจะเป็น:

First line Second line

หากคุณหมายถึงสิ่งนี้จริงๆคุณต้องแก้ไขคำพูดเดียวด้วยเครื่องหมาย "":

echo "\r\n";

มิฉะนั้นถ้าคุณต้องการแบ่งข้อความในตัวอย่าง 'บรรทัดแรก' และ 'บรรทัดที่สอง' ของเราคุณต้องใช้รหัส html <br />:

First line<br />Second line

ที่จะส่งออก:

First line
Second line

และจะอ่านได้ง่ายขึ้นหากคุณแทนที่สคริปต์ทั้งหมดด้วย:

echo "$clientid $lastname \r\n";

1
ไม่ไม่ควร เพราะส่วนใหญ่มันผิด บล็อกโค้ดแรกจะแสดงผลเป็นFirst line Second line- ช่องว่างใด ๆ รวมถึงการขึ้นบรรทัดใหม่จะบีบอัดอักขระหนึ่งช่องว่างในเอาต์พุตที่แสดงผล นอกจากนี้ยัง</br>มีทุกอย่างยกเว้น HTML ที่ถูกต้อง
D_4_ni

1
โปรดทราบว่าหากคุณส่งอีเมลข้อความด้วยสคริปต์ PHP ของคุณคุณจะต้องใช้การสิ้นสุดบรรทัดเหล่านั้นแทนการหยุดพัก (<br>)
KennyV

9

w3school เสนอวิธีนี้:

echo nl2br("One line.\n Another line.");

โดยการใช้ฟังก์ชั่นนี้คุณสามารถทำได้ .. ฉันลองวิธีอื่น ๆ ที่กล่าวข้างต้น แต่พวกเขาจะไม่ช่วยฉัน ..


คำถามไม่ได้เกี่ยวกับการแบ่งบรรทัดภายในย่อหน้าใน HTML มันเกี่ยวกับตัวละครขึ้นบรรทัดใหม่ !
Damien Flament

สำหรับบริบทnl2br()ฟังก์ชันแปลงอักขระบรรทัดใหม่เป็น<br />แท็ก HTML สิ่งนี้อาจมีประโยชน์สำหรับการสร้างบรรทัดใหม่ในหน้าเบราว์เซอร์ แต่ไม่ใช่บรรทัดใหม่ในไฟล์ข้อความหรือ JavaScript หรือพิมพ์ไปที่หน้าจอหรือคอนโซล
SherylHohman

4

ด้วยเหตุผลบางอย่างทุกโพสต์เดียวที่ถามเกี่ยวกับการขึ้นบรรทัดใหม่ใน PHP ไม่สามารถพูดถึงกรณีที่เพียงแค่การขึ้นบรรทัดใหม่ในสตริงที่มีการเสนอราคาเดี่ยวจะทำสิ่งที่คุณคิดว่า:

เช่น 1

 echo 'foo\nbar';

ตัวอย่างที่ 1 ชัดเจนไม่พิมพ์ผลลัพธ์ที่ต้องการอย่างไรก็ตามในขณะที่เป็นจริงคุณไม่สามารถหนีขึ้นบรรทัดใหม่ด้วยเครื่องหมายคำพูดเดี่ยวคุณสามารถมี:

เช่น 2

 echo 'foo
 bar';

ตัวอย่างที่ 2 มีพฤติกรรมที่ต้องการอย่างแน่นอน น่าเสียดายที่บรรทัดใหม่ที่ถูกแทรกนั้นขึ้นอยู่กับระบบปฏิบัติการ สิ่งนี้มักจะไม่เป็นปัญหาเนื่องจากเว็บเบราว์เซอร์ / เซิร์ฟเวอร์จะตีความบรรทัดใหม่อย่างถูกต้องไม่ว่าจะเป็น \ r, \ r \ n หรือ \ n

เห็นได้ชัดว่าการแก้ปัญหานี้ไม่เหมาะถ้าคุณวางแผนที่จะแจกจ่ายไฟล์ผ่านวิธีอื่นแล้วเว็บเบราว์เซอร์และระบบปฏิบัติการหลายระบบ ในกรณีนี้คุณควรเห็นคำตอบอย่างใดอย่างหนึ่ง

หมายเหตุ: การใช้โปรแกรมแก้ไขข้อความที่มีคุณลักษณะคุณควรแทรกขึ้นบรรทัดใหม่เป็นอักขระไบนารีที่แสดงถึงบรรทัดใหม่ในระบบปฏิบัติการที่แตกต่างจากการแก้ไขไฟล์ หากทุกอย่างล้มเหลวเพียงแค่ใช้ตัวแก้ไขฐานสิบหกเพื่อแทรกอักขระไบนารี ascii


3

ใช้ PHP nl2br เพื่อรับบรรทัดใหม่ในสตริงข้อความ ..

$ text = "มนูเป็นเด็กดี (Enter) เขาสามารถเขียนรหัสได้ดี

echo nl2br ($ text);

ผลลัพธ์.

มนูเป็นเด็กดี

เขาสามารถเขียนโปรแกรมได้ดี


1
nl2brฟังก์ชั่นแปลงอักขระขึ้นบรรทัดใหม่ให้กับ<br />แท็ก หากสตริงไม่มีอักขระขึ้นบรรทัดใหม่ฟังก์ชันนี้จะไม่ทำอะไรเลย! ยิ่งไปกว่านั้นคำถามไม่ได้เกี่ยวกับการแบ่งบรรทัดภายในย่อหน้าใน HTML มันเกี่ยวกับตัวละครขึ้นบรรทัดใหม่ !
Damien Flament

2

ฉันได้ลองชุดค่าผสมนี้ทั้งในเครื่องหมายคำพูดเดี่ยวและเครื่องหมายคำพูดคู่ แต่ไม่มีใครทำงาน แทนที่จะใช้การใช้ที่\nดีกว่า<br/>ในเครื่องหมายคำพูดคู่ แบบนี้..

$variable = "and";
echo "part 1 $variable part 2<br/>";
echo "part 1 ".$variable." part 2";

คำถามไม่ได้เกี่ยวกับการแบ่งบรรทัดภายในย่อหน้าใน HTML มันเกี่ยวกับตัวละครขึ้นบรรทัดใหม่ !
Damien Flament


2

สำหรับคำสั่ง echo ใด ๆ ฉันมักจะใช้<br>เครื่องหมายคำพูดคู่


2
คำถามไม่ได้เกี่ยวกับการแบ่งบรรทัดภายในย่อหน้าใน HTML มันเกี่ยวกับตัวละครขึ้นบรรทัดใหม่ !
Damien Flament

1

ไม่มีอะไรทำงานให้ฉัน

PHP_EOL

. "\r\n";

$NEWLINE_RE = '/(\r\n)|\r|\n/'; // take care of all possible newline-encodings in input file
$var = preg_replace($NEWLINE_RE,'', $var);

ใช้งานได้สำหรับฉัน:

$admin_email_Body = $admin_mail_body .'<br>' ."\r\n";
$admin_email_Body .= 'This is line 2 <br>' ."\r\n";
$admin_email_Body .= 'This is line 3 <br>' ."\r\n";

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.