Làm cách nào để thay thế tất cả các ngắt dòng trong một chuỗi bằng các phần tử <br />?


536

Làm cách nào tôi có thể đọc ngắt dòng từ một giá trị bằng JavaScript và thay thế tất cả các ngắt dòng bằng <br />các phần tử?

Thí dụ:

Một biến được truyền từ PHP như dưới đây:

  "This is man.

     Man like dog.
     Man like to drink.

     Man is the king."

Tôi muốn kết quả của mình trông giống như thế này sau khi JavaScript chuyển đổi nó:

  "This is man<br /><br />Man like dog.<br />Man like to drink.<br /><br />Man is the king."

1
Có gì sai với câu hỏi ban đầu của bạn? stackoverflow.com/questions/784313/ cường
harto

1
Bạn cũng có thể thực hiện nl2br ($ string) trong PHP trước khi gửi nó tới JavaScript.
alex

1
Tôi sẽ bỏ phiếu để đóng câu hỏi trước đó, vì đây là một ví dụ tốt hơn.
mí mắt

2
Anh ta nên chỉnh sửa câu hỏi ban đầu sau đó
nickf

Tôi đến đây từ một sự hiểu biết sai lầm cho những gì đang xảy ra với .text (). Xem stackoverflow.com/q353238362/1467394 nếu đó cũng là những gì bạn đang làm
David

Câu trả lời:


1202

Điều này sẽ biến tất cả lợi nhuận thành HTML

str = str.replace(/(?:\r\n|\r|\n)/g, '<br>');

Trong trường hợp bạn tự hỏi những gì ?: Có nghĩa là. Nó được gọi là một nhóm không bắt giữ. Điều đó có nghĩa là nhóm regex trong ngoặc đơn sẽ không được lưu trong bộ nhớ để được tham chiếu sau. Bạn có thể kiểm tra các chủ đề này để biết thêm thông tin:
https://stackoverflow.com/a/11530881/5042169 https://stackoverflow.com/a/36524555/5042169


77
Chỉ cần lưu ý thêm: str.replace("\n", '<br />')(đối số đầu tiên là một chuỗi thông thường) sẽ chỉ thay thế lần xuất hiện đầu tiên.
Serge S.

19
Một phiên bản khác (để thay thế nhiều ngắt dòng): str.replace (/ (\ n) + / g, '<br />');
Ritesh

4
@SergeS. Cảm ơn vì nhận xét thêm. Chỉ cần tiết kiệm cho tôi một TONNE của thời gian! jsfiddle
EleventyOne

4
@SergeS., Ép String#replacebuộc đối số đầu tiên của nó từ Stringmột thể hiện thoát RegExp, không có cờ. str.replace('\n', '<br />');tương đương vớistr.replace(new RegExp('\n'), '<br />');
mí mắt

2
Dưới đây là trường hợp thử nghiệm so với str.split("\n").join("<br />") jsperf.com/split-join-vs-replace-regex RegEx có vẻ nhanh hơn một chút
Aley

390

Nếu mối quan tâm của bạn chỉ là hiển thị ngắt dòng, bạn có thể làm điều này với CSS.

<div style="white-space: pre-line">Some test
with linebreaks</div>

Jsfiddle: https://jsfiddle.net/5bvtL6do/2/

Lưu ý : Hãy chú ý đến định dạng mã và thụt lề, vì white-space: pre-linesẽ hiển thị tất cả các dòng mới (ngoại trừ dòng mới cuối cùng sau văn bản, xem fiddle).


59
Câu trả lời tuyệt vời ... cần nhiều hơn nữa!
Ian Quigley

11
Tôi đến đây để tìm kiếm regex và rời đi với điều này. Trong rất nhiều dịp đây là những gì mọi người đang tìm kiếm. Đôi khi, chúng tôi sử dụng ngắt dòng cho email và đôi khi cần hiển thị dòng email trông như thế nào trong html. Hoàn hảo. Cảm ơn bạn đã xem xét câu hỏi ở một
khía cạnh

1
Điều này có thể hoạt động cho ngắt dòng thực tế, nhưng nếu tôi có "\ n" như thế nào trong câu hỏi thì sao? Tôi cũng có thể giải quyết vấn đề này bằng CSS chứ?
Froxx

18
Thay vì white-space: pre-wrap;tôi thích sử dụng white-space: pre-line;(để không thêm một dòng ngắt cuối cùng)
jpmottin

5
Có vẻ tốt nhưng một không gian khổng lồ trước dòng đầu tiên thì sao? kỳ lạ
Bộ công cụ

71

Không có regex:

str = str.split("\n").join("<br />");

2
Nếu bạn thực hiện "\ n", bạn sẽ tránh được các sự cố khi chỉ chia "n".
CrowderSoup

10
@CrowderSoup hmm? Tôi vừa thử nó và \\nkhông khớp trên một dòng mới, vì nó đang tìm kiếm backslash+ n.
paulslater19

1
Tôi đã làm một trường hợp thử nghiệm. RegEx nhanh hơn một chút, nhưng hãy tự mình kiểm tra jsperf.com/split-join-vs-replace-regex
Aley

Tôi thấy câu trả lời này không hoạt động trừ khi dấu gạch chéo được thoát ra. Ví dụ: str = str.split ("\ n"). Tham gia ("<br />");
ACOMIT001

@ ACOMIT001 Tôi đoán điều đó phụ thuộc vào việc chuỗi có một dòng mới hay một dấu gạch chéo đen và n?
paulslater19

38

Điều này hoạt động cho đầu vào đến từ một vùng văn bản

str.replace(new RegExp('\r?\n','g'), '<br />');

1
Đó là câu trả lời tốt nhất cho tôi vì bạn đã không quên \ r, được sử dụng trên một số hệ thống
Bartłomiej Zalewski

1
Đây là câu trả lời tốt nhất cho câu hỏi này. Nhưng tôi sẽ chỉ đi với <br> chứ không phải <br />. Xem một stackoverflow.com/questions/1946426/html-5-is-it-br-br-or-br
kheya

8

Nếu câu trả lời được chấp nhận không phù hợp với bạn thì bạn có thể thử.

str.replace(new RegExp('\n','g'), '<br />')

Nó làm việc cho tôi.


2
new RegExp('\n', 'g')là giống hệt với /\n/g(ngoại trừ một số chi tiết vụn vặt về việc sử dụng chữ gốc so với các nhà xây dựng của họ).
mí mắt

2
dù lý do là gì đi nữa, điều này có hiệu quả với tôi nhưng câu trả lời được chấp nhận thì không
nick

1
À, tương tự ở đây ... nhưng lỗi của tôi là cố gắng chỉ định /\n/glà một chuỗi!
Daniel Fortunov

7

Bất kể hệ thống:

my_multiline_text.replace(/$/mg,'<br>');

1
Thận trọng: Điều này sẽ gắn thẻ '<br>' vào bất kỳ chuỗi nào, bất kể có '\ n' trong đó hay không.
mkoeller

4

Điều cũng quan trọng là mã hóa phần còn lại của văn bản để bảo vệ khỏi các cuộc tấn công tiêm mã có thể xảy ra

function insertTextWithLineBreaks(text, targetElement) {
    var textWithNormalizedLineBreaks = text.replace('\r\n', '\n');
    var textParts = textWithNormalizedLineBreaks.split('\n');

    for (var i = 0; i < textParts.length; i++) {
        targetElement.appendChild(document.createTextNode(textParts[i]));
        if (i < textParts.length - 1) {
            targetElement.appendChild(document.createElement('br'));
        }
    }
}


2

Đối với những người bạn chỉ muốn cho phép tối đa. 2 <br>liên tiếp, bạn có thể sử dụng này:

let text = text.replace(/(\r?\n){2,}/g, '<br><br>');
text = text.replace(/(\r?\n)/g, '<br>');

Dòng đầu tiên: Tìm kiếm \nHOẶC \r\nnơi có ít nhất 2 trong số đó là liên tiếp, ví dụ \n\n\n\n. Sau đó thay thế bằng 2br

Dòng thứ hai: Tìm kiếm tất cả đơn \r\nhoặc \nthay thế chúng bằng<br>


1

nếu bạn gửi biến từ PHP, bạn có thể lấy biến này trước khi gửi:

$string=nl2br($string);

0

Nó sẽ thay thế tất cả các dòng mới với break

str = str.replace(/\n/g, '<br>')

Nếu bạn muốn thay thế tất cả các dòng mới bằng một dòng ngắt

str = str.replace(/\n*\n/g, '<br>')

Đọc thêm về Regex: https://dl.icewarp.com/online_help/203030104.htm điều này sẽ giúp bạn mọi lúc.


Cũng có thể sử dụng regex như thế này str = str.replace(/\n+/g, '<br>')cho trường hợp thứ hai
Matteo Basso

0

Không trả lời câu hỏi cụ thể, nhưng tôi chắc chắn rằng điều này sẽ giúp ai đó ...

Nếu bạn có đầu ra từ PHP mà bạn muốn kết xuất trên trang web bằng JavaScript (có lẽ là kết quả của yêu cầu Ajax) và bạn chỉ muốn giữ lại khoảng trắng và ngắt dòng, hãy xem xét việc đặt văn bản bên trong một <pre></pre>khối:

var text_with_line_breaks = retrieve_some_text_from_php();
var element = document.querySelectorAll('#output');
element.innerHTML = '<pre>' + text_with_line_breaks + '</pre>';

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.