PHP - làm thế nào để tạo một ký tự dòng mới?


405

Trong PHP tôi đang cố gắng tạo một ký tự dòng mới:

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

Sau đó tôi mở tệp đã tạo trong Notepad và nó viết dòng mới theo nghĩa đen:

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

Tôi đã thử nhiều biến thể của \r\n, nhưng không có tác dụng. Tại sao dòng mới không chuyển thành dòng mới?


Câu trả lời:


638

Chỉ các chuỗi được trích dẫn kép diễn giải các chuỗi thoát \rvà lần lượt \nlà '0x0D' và '0x0A', vì vậy bạn muốn:

"\r\n"

Mặt khác, chuỗi trích dẫn duy nhất, chỉ biết các chuỗi thoát \\\'.

Vì vậy, trừ khi bạn nối chuỗi được trích dẫn với một ngắt dòng được tạo ở nơi khác (ví dụ: sử dụng chuỗi được trích dẫn kép "\r\n"hoặc sử dụng chrhàm chr(0x0D).chr(0x0A) ), cách duy nhất khác để ngắt dòng trong một chuỗi được trích dẫn là nhập chuỗi bằng trình soạn thảo của bạn theo nghĩa đen:

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

Đảm bảo kiểm tra trình chỉnh sửa của bạn để biết cài đặt ngắt dòng nếu bạn yêu cầu một số chuỗi ký tự cụ thể ( \r\nví dụ).


1
@Pacerier Cách duy nhất để có trở lại vận chuyển và các ký tự dòng mới trong một chuỗi được trích dẫn là nhập trực tiếp các ký tự qua bàn phím (nhấn Enter, tùy thuộc vào cài đặt của trình soạn thảo của bạn trên đầu cuối của dòng). Nếu không, chỉ cần sử dụng nối chuỗi.
Gumbo

1
@Gumbo: Mặt khác, bạn đang nói các chuỗi trích dẫn đơn, chỉ biết các chuỗi thoát \ và \ '. Nhưng tôi vừa in một dòng có tiếng vang là <? Php echo 'Bạn đang sử dụng Internet Explorer. <Br>'; echo 'Dòng mới được thêm'; ?> và thấy đầu ra trong trình duyệt. Nó thực sự đã thêm dòng mới giữa hai chuỗi tôi hiển thị. Nó có nghĩa là ký tự <br> hoặc <br/> được mở rộng trong một chuỗi trích dẫn. Có bất kỳ ký tự HTML nào khác ngoài ba ký tự này có thể được hiểu bởi PHP bên trong các chuỗi được trích dẫn không? Tôi vui lòng yêu cầu bạn cập nhật câu trả lời của bạn cho phù hợp. Cảm ơn bạn.
PHPFan

1
@ user2839497 Những gì bạn đang nói không có ý nghĩa gì. Không có bối cảnh trình duyệt ở đây. Và tất nhiên, trình duyệt sẽ hiển thị một dòng mới khi gặp phải một <br/>. Và tất nhiên, không có gì ngăn bạn thêm '<br/>' trong một chuỗi trích dẫn. Nhưng điều đó không hiển thị một dòng mới trong một tệp văn bản đơn giản.
Fencer

1
@Pacerier Đối với một chính sách trích dẫn thay vì ngắt chuỗi trong trình soạn thảo như Gumbo đã đề xuất trong nhận xét của mình, bạn có thể sử dụng giải pháp khác trong câu trả lời của Gumbos, ví dụ: 'xuất ra một dòng mới'.chr (0x0A).' Trong một chuỗi được trích dẫn '.
Fencer

2
PHP_EOLThay vào đó, bạn nên sử dụng
Kurdtpage 18/07/19

234

Sử dụng PHP_EOLhằng số được xác định trước :

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

Giá trị không đổi sẽ được đặt theo các kết thúc dòng của hệ điều hành nơi PHP đang thực thi. Trên Linux, nó sẽ là "\n"; trên Windows, nó sẽ được "\r\n".


97

Lệnh "echo" trong PHP gửi đầu ra tới trình duyệt dưới dạng html thô, vì vậy ngay cả khi trích dẫn kép, trình duyệt sẽ không phân tích thành hai dòng vì một ký tự dòng mới trong HTML không có nghĩa gì. Đó là lý do tại sao bạn cần sử dụng:

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

khi sử dụng "echo", hoặc thay vào đó hãy sử dụng fwrite ...

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

Điều này sẽ xuất ra dòng mới HTML thay cho "\ n".


4
Với cách đặt câu hỏi, có khả năng anh ta đang xuất dữ liệu này sang hộp văn bản hoặc javascript, v.v. để phân tích cú pháp hoặc đọc văn bản đơn giản không được hiển thị dưới dạng HTML
PC3TJ


23

Các chuỗi giữa các dấu ngoặc kép ""nội suy, nghĩa là chúng chuyển đổi các ký tự thoát thành các ký tự có thể in được.

Các chuỗi giữa các dấu ngoặc đơn ''là nghĩa đen, nghĩa là chúng được xử lý chính xác như các ký tự được nhập vào.

Bạn có thể có cả hai trên cùng một dòng:

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

đầu ra:

$clientid $lastname
1 John Doe

Giải thích của bạn về các loại ký hiệu chuỗi khác nhau trong PHP là tốt vì nó hiển thị lỗi do tác giả câu hỏi. Nhưng mẫu mã của bạn sẽ không tạo ra kết quả như mong đợi vì các biến được sử dụng trong một chuỗi được trích dẫn và, như bạn đã đề cập, chúng sẽ không được nội suy!
Damien Flires

@Damien Flament, đó là những gì tôi đã nói - nội dung giữa các trích dẫn đơn không được nội suy, nhưng nội dung giữa các trích dẫn kép là. Có lẽ ví dụ của tôi là khó hiểu bởi vì bạn đang mong đợi để xem nội dung của $ clientid và $ Lastname, thay vì chữ "$ clientid" và "$ Lastname". Tôi nghĩ rằng đây là tiêu đề của một bảng mà tôi đã sử dụng trong quá trình gỡ lỗi. những dòng sau đây sẽ làecho "$clientid $lastname\r\n"
Kevin S. Miller

Khi viết "kết quả mong đợi", tôi đang nói về kết quả mà tác giả câu hỏi mong đợi trong câu hỏi của mình. Thêm mã hiển thị trên nhận xét của bạn vào câu trả lời của bạn và hiển thị kết quả có thể cải thiện chất lượng câu trả lời của bạn.
Damien Flires


13

Trên thực tế \r\nlà cho phía html của đầu ra. Với những ký tự này, bạn chỉ có thể tạo một dòng mới trong mã html để dễ đọc hơn:

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

sẽ xuất ra:

<html>First line
Second line</html>

rằng xem trang sẽ là:

First line Second line

Nếu bạn thực sự muốn nói điều này, bạn chỉ cần sửa một trích dẫn bằng trích dẫn "":

echo "\r\n";

Mặt khác, nếu bạn muốn chia văn bản, trong mẫu 'Dòng đầu tiên' và 'Dòng thứ hai' của chúng tôi, bạn phải sử dụng mã html <br />::

First line<br />Second line

sẽ xuất ra:

First line
Second line

Ngoài ra, nó sẽ dễ đọc hơn nếu bạn thay thế toàn bộ tập lệnh bằng:

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

1
Không, nó không nên. Bởi vì nó hầu như sai. Khối mã đầu tiên sẽ hiển thị dưới dạng First line Second line- mọi khoảng trắng bao gồm cả dòng mới sẽ nén thành một ký tự khoảng trắng trong đầu ra được kết xuất. Ngoài ra, </br>là bất cứ điều gì ngoại trừ HTML hợp lệ.
D_4_ni

1
Ngoài ra, hãy nhớ rằng nếu bạn đang gửi email văn bản với tập lệnh php của mình, bạn vẫn sẽ cần các kết thúc dòng đó thay vì ngắt (<br>)
KennyV

9

w3school cung cấp theo cách này:

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

bằng cách sử dụng chức năng này, bạn có thể làm điều đó..tôi đã thử những cách khác đã nói ở trên nhưng chúng sẽ không giúp tôi ..


Câu hỏi không phải là về việc ngắt một dòng trong một đoạn trong HTML. Đó là về nhân vật dòng mới !
Damien Flires

Đối với ngữ cảnh, nl2br()hàm chuyển đổi các ký tự dòng mới thành <br />thẻ HTML. Điều này có thể hữu ích để tạo một dòng mới trên các trang trình duyệt, nhưng không phải là một dòng mới trong các tệp văn bản, hoặc JavaScript, hoặc in ra màn hình hoặc bảng điều khiển.
SherylHohman

4

Vì một số lý do, mỗi bài đăng hỏi về thoát dòng mới trong PHP không đề cập đến trường hợp chỉ cần chèn một dòng mới vào chuỗi trích dẫn đơn sẽ làm chính xác những gì bạn nghĩ:

ví dụ 1

 echo 'foo\nbar';

Ví dụ 1 rõ ràng không in kết quả mong muốn, tuy nhiên, trong khi sự thật là bạn không thể thoát một dòng mới trong dấu ngoặc đơn, bạn có thể có một:

cũ 2.

 echo 'foo
 bar';

Ví dụ 2 có chính xác hành vi mong muốn. Thật không may, dòng mới được chèn là phụ thuộc hệ điều hành. Đây thường không phải là vấn đề, vì trình duyệt / máy chủ web sẽ diễn giải chính xác dòng mới cho dù đó là \ r, \ r \ n hay \ n.

Rõ ràng giải pháp này không lý tưởng nếu bạn có kế hoạch phân phối tệp thông qua các phương tiện khác sau đó là trình duyệt web và tới nhiều hệ điều hành. Trong trường hợp đó, bạn sẽ thấy một trong những câu trả lời khác.

lưu ý: bằng cách sử dụng trình soạn thảo văn bản giàu tính năng, bạn sẽ có thể chèn một dòng mới dưới dạng (các) ký tự nhị phân đại diện cho một dòng mới trên một hệ điều hành khác với một chỉnh sửa tệp. Nếu vẫn thất bại, chỉ cần sử dụng trình soạn thảo hex để chèn ký tự ascii nhị phân sẽ làm.


3

Sử dụng nl2br PHP để nhận các dòng mới trong chuỗi văn bản ..

$ text = "Manu là một cậu bé tốt. (Enter) Anh ấy có thể viết mã tốt.

echo nl2br ($ văn bản);

Kết quả.

Manu là một cậu bé tốt.

Anh ta có thể viết mã tốt.


1
Các nl2brchức năng chuyển đổi ký tự newline đến <br />thẻ HTML. Nếu chuỗi không chứa bất kỳ ký tự dòng mới nào, hàm này sẽ không làm gì cả! Ngoài ra, câu hỏi không phải là về việc ngắt một dòng trong một đoạn trong HTML. Đó là về nhân vật dòng mới !
Damien Flires

2

Tôi cũng đã thử kết hợp này trong cả dấu ngoặc đơn và dấu ngoặc kép. Nhưng không ai đã làm việc. Thay vì sử dụng \ntốt hơn <br/>trong dấu ngoặc kép. Như thế này..

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

Câu hỏi không phải là về việc ngắt một dòng trong một đoạn trong HTML. Đó là về nhân vật dòng mới !
Damien Flires

2

Sử dụng chr (13) cho lợi nhuận vận chuyển và chr (10) cho dòng mới

echo $clientid;
echo ' ';
echo $lastname;
echo ' ';
echo chr (13). chr (10);

2

Đối với bất kỳ câu lệnh echo, tôi luôn sử dụng <br>bên trong dấu ngoặc kép.


2
Câu hỏi không phải là về việc ngắt một dòng trong một đoạn trong HTML. Đó là về nhân vật dòng mới !
Damien Flires

1

Không có gì làm việc cho tôi.

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);

Làm việc cho tôi:

$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";

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.