Menu

Xuống dòng trong PHP: \n, PHP_EOL và nl2br

Để in xuống dòng trong PHP, viết "\n" trong dấu nháy kép hoặc dùng PHP_EOL. Trên trang web, ký tự xuống dòng không hiện ra, nên hãy dùng <br> hoặc nl2br(). Tìm hiểu sự khác nhau, vì sao '\n' trong dấu nháy đơn không chạy, và cách tách hoặc bỏ ký tự xuống dòng.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Viết \n trong một chuỗi dấu nháy kép để in xuống dòng: echo "Line 1\nLine 2";. Hằng số PHP_EOL làm việc tương tự và dễ đọc hơn ở cuối dòng: echo 'Done' . PHP_EOL;. Trên trang web, ký tự xuống dòng không hiện thành ngắt dòng; ở đó bạn cần <br> hoặc nl2br().

Dấu nháy đơn và dấu nháy kép

Các chuỗi escape như \n và \t chỉ có tác dụng trong dấu nháy kép. Trong dấu nháy đơn, '\n' là hai ký tự: một dấu gạch chéo ngược và chữ n. Đây là lý do thường gặp nhất khiến "\n không chạy".

Trang chuỗi liệt kê mọi chuỗi escape mà dấu nháy kép hiểu được.

PHP_EOL và "\n"

PHP_EOL là ký tự kết thúc dòng của hệ thống mà PHP đang chạy: "\n" trên Linux và macOS, "\r\n" trên Windows. Dùng nó cho đầu ra trên terminal và cho tệp bạn sẽ đọc trên cùng máy. Khi một định dạng tự quy định ký tự kết thúc dòng, hãy dùng ký tự đó: header HTTP và email cần "\r\n", còn phần lớn công cụ đọc "\n" tốt ở mọi nơi.

"\r" là ký tự về đầu dòng (carriage return), "\n" là ký tự xuống dòng (line feed). Tệp trên Windows kết thúc dòng bằng cả hai, "\r\n", vì vậy văn bản từ người dùng Windows hoặc từ một <textarea> thường chứa những ký tự \r bạn không ngờ tới.

Xuống dòng trong HTML: br và nl2br

Trình duyệt gộp các ký tự xuống dòng thành một dấu cách, nên echo "a\nb" hiện thành a b trên trang. Hoặc bạn tự in <br>, hoặc giữ ký tự xuống dòng trong văn bản rồi chuyển chúng bằng nl2br(), hàm này chèn <br /> trước mỗi ký tự xuống dòng. Chạy code này và so sánh tab Đầu ra với tab Trang:

Ở tab Đầu ra, cả ba trông giống nhau. Ở tab Trang, cái đầu tiên dính liền trên một dòng, nl2br() ngắt nó ra, còn <pre> giữ nguyên các ký tự xuống dòng như khi viết.

Hiển thị nội dung textarea kèm các dòng

Văn bản từ một <textarea> giữ nguyên các dòng người dùng gõ, nhưng bạn phải escape nó trước khi in vào HTML. Thứ tự rất quan trọng: htmlspecialchars() trước, rồi mới nl2br(), nếu không chính các thẻ <br /> sẽ bị escape. Chạy code, gõ vài dòng vào ô rồi nhấn Preview: cùng script đó chạy lại với $_POST đã có dữ liệu.

Một chỗ xuống dòng trong textarea có thể đến dưới dạng "\r\n" hoặc "\n"; cả hai đều chứa "\n", nên đếm ký tự đó là đúng trong cả hai trường hợp. htmlspecialchars() giải thích vì sao ở đây không thể bỏ qua bước escape.

Tách chuỗi theo dòng

explode("\n", $text) dùng được cho văn bản do bạn tự tạo. Với văn bản từ người dùng hoặc từ tệp, ký tự kết thúc dòng có thể là "\r\n", "\n" hoặc "\r"; preg_split('/\R/', $text) xử lý được tất cả, vì \R khớp với mọi kiểu xuống dòng.

Bỏ ký tự xuống dòng khỏi chuỗi

Để biến văn bản nhiều dòng thành một dòng, hãy thay mọi kiểu ký tự kết thúc dòng. Thay "\r\n" trước các ký tự đơn lẻ, nếu không mỗi chỗ xuống dòng kiểu Windows sẽ thành hai dấu cách:

trim() và rtrim() bỏ ký tự xuống dòng ở hai đầu chuỗi nhưng không bao giờ ở giữa, nên chúng là công cụ đúng cho một dòng đọc từ tệp và là công cụ sai để nối các dòng.

Câu hỏi thường gặp

Làm sao echo xuống dòng trong PHP?

Đặt \n trong một chuỗi dấu nháy kép: echo "Line 1\nLine 2";. Hoặc nối thêm hằng số: echo 'Line 1' . PHP_EOL;. Trong trình duyệt, ký tự xuống dòng không hiện ra; ở đó hãy dùng <br> hoặc nl2br().

Vì sao \n không chạy trong PHP?

Hoặc chuỗi nằm trong dấu nháy đơn, nơi '\n' là một dấu gạch chéo ngược và chữ n, hoặc đầu ra được hiển thị dưới dạng HTML, nơi trình duyệt coi ký tự xuống dòng như một dấu cách. Dùng "\n" trong dấu nháy kép cho đầu ra dạng văn bản và nl2br() hoặc <br> cho trang web.

PHP_EOL là gì?

Là một hằng số chứa ký tự kết thúc dòng của hệ điều hành mà PHP đang chạy: "\n" trên Linux và macOS, "\r\n" trên Windows. Dùng nó cho đầu ra trên terminal hoặc tệp cục bộ; với HTTP, email và tệp CSV, định dạng thường quy định sẵn ký tự kết thúc dòng bất kể hệ điều hành.

nl2br trong PHP làm gì?

nl2br($text) chèn <br /> trước mỗi chỗ xuống dòng trong chuỗi, nên văn bản gõ trong <textarea> giữ nguyên các dòng khi hiển thị bằng HTML. Hãy escape trước: nl2br(htmlspecialchars($text)).

Làm sao bỏ ký tự xuống dòng khỏi một chuỗi trong PHP?

Thay cả ba kiểu kết thúc dòng: str_replace(["\r\n", "\r", "\n"], ' ', $text), hoặc dùng regex, preg_replace('/\R/', ' ', $text). Để chỉ bỏ ký tự xuống dòng ở cuối, dùng rtrim($text, "\r\n").

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu