ฉันจะแทนที่ตัวแบ่งบรรทัดทั้งหมดในสตริงด้วยองค์ประกอบ <br /> ได้อย่างไร


536

ฉันจะอ่านตัวแบ่งบรรทัดจากค่าด้วย JavaScript และแทนที่ตัวแบ่งบรรทัดทั้งหมดด้วย<br />องค์ประกอบได้อย่างไร

ตัวอย่าง:

ตัวแปรที่ส่งผ่านจาก PHP ดังต่อไปนี้:

  "This is man.

     Man like dog.
     Man like to drink.

     Man is the king."

ฉันต้องการให้ผลลัพธ์ของฉันเป็นแบบนี้หลังจากที่ JavaScript ทำการแปลง:

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

1
มีคำถามผิดปกติกับคุณหรือไม่? stackoverflow.com/questions/784313/…
harto

1
คุณสามารถทำ nl2br ($ string) ใน PHP ก่อนที่จะส่งไปยัง JavaScript
alex

1
ฉันจะลงคะแนนให้ปิดคำถามก่อนหน้านี้เนื่องจากนี่เป็นตัวอย่างที่ดีกว่า
เปลือกตา

2
เขาควรจะแก้ไขคำถามแรกแล้ว
nickf

ฉันมาที่นี่จากความเข้าใจที่คลาดเคลื่อนถึงสิ่งที่เกิดขึ้นด้วย. text () ดูstackoverflow.com/q/35238362/1467396หากนั่นคือสิ่งที่คุณกำลังทำเช่นกัน
เดวิด

คำตอบ:


1202

สิ่งนี้จะเปลี่ยนผลตอบแทนทั้งหมดเป็น HTML

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

ในกรณีที่คุณสงสัยว่าอะไร: หมายถึง มันถูกเรียกว่ากลุ่มที่ไม่ได้ดักจับ หมายความว่ากลุ่มของ regex ภายในวงเล็บจะไม่ถูกบันทึกในหน่วยความจำเพื่อใช้อ้างอิงในภายหลัง คุณสามารถตรวจสอบกระทู้เหล่านี้สำหรับข้อมูลเพิ่มเติม:
https://stackoverflow.com/a/11530881/5042169 https://stackoverflow.com/a/36524555/5042169


77
เพียงหมายเหตุเพิ่มเติม: str.replace("\n", '<br />')(อาร์กิวเมนต์แรกเป็นสตริงปกติ) จะแทนที่การเกิดขึ้นครั้งแรกเท่านั้น
Serge S.

19
รุ่นอื่น (เพื่อแทนที่ตัวแบ่งบรรทัดหลายรายการ): str.replace (/ (\ n) + / g, '<br />');
Ritesh

4
@SergeS ขอบคุณสำหรับความคิดเห็นพิเศษ เพียงแค่ช่วยฉัน TONNE ของเวลา! jsfiddle
EleventyOne

4
@SergeS. String#replacecoerces อาร์กิวเมนต์แรกจากStringไปยังRegExpอินสแตนซ์ที่หลบหนีโดยไม่มีแฟล็ก str.replace('\n', '<br />');เทียบเท่ากับstr.replace(new RegExp('\n'), '<br />');
ชั้นหนังแท้

2
นี่คือกรณีทดสอบเปรียบเทียบกับstr.split("\n").join("<br />") jsperf.com/split-join-vs-replace-regex RegEx ดูเหมือนเร็วขึ้นเล็กน้อย
Aley

390

หากความกังวลของคุณเป็นเพียงการแสดง linebreaks คุณสามารถทำได้ด้วย CSS

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

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

หมายเหตุ : ให้ความสนใจกับการจัดรูปแบบโค้ดและการเยื้องเนื่องจากwhite-space: pre-lineจะแสดงบรรทัดใหม่ทั้งหมด (ยกเว้นบรรทัดใหม่ล่าสุดหลังข้อความดูซอ)


59
คำตอบที่ดี ... ต้องการการโบ๊ทมากขึ้น!
Ian Quigley

11
ฉันมาที่นี่เพื่อค้นหา regex และทิ้งไว้กับสิ่งนี้ ในหลายโอกาสนี่คือสิ่งที่ผู้คนกำลังมองหา เราใช้การแบ่งบรรทัดสำหรับอีเมลและต้องการแสดงสิ่งที่อีเมลดูเป็นบรรทัดใน html บางครั้ง Perfecto ขอบคุณที่ดูคำถามในมุมมองที่ต่างออกไป
Mutmatt

1
สิ่งนี้อาจใช้ได้กับการขึ้นบรรทัดใหม่จริง แต่ถ้าฉันมีคำถามแบบ "\ n" ฉันสามารถแก้ปัญหานี้ด้วย CSS ได้หรือไม่
Froxx

18
แทน white-space: pre-wrap;ฉันชอบใช้white-space: pre-line;(เพื่อไม่เพิ่มบรรทัดสุดท้ายสุดท้าย)
jpmottin

5
ดูดี แต่ถ้าเป็นพื้นที่ขนาดยักษ์ก่อนบรรทัดแรกล่ะ แปลก
ชุดเครื่องมือ

71

โดยไม่ต้อง regex:

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

2
หากคุณทำ "\\ n" คุณจะหลีกเลี่ยงปัญหาการแยก "n" เพียงอย่างเดียว
CrowderSoup

10
@CrowderSoup อืม ฉันแค่พยายามมันและ\\nไม่ตรงกับในบรรทัดใหม่เพราะมันกำลังมองหา+backslash n
paulslater19

1
ฉันทำกรณีทดสอบ RegEx เร็วขึ้นเล็กน้อย แต่ลองดูด้วยตัวคุณเองjsperf.com/split-join-vs-replace-regex
Aley

ฉันพบว่าคำตอบนี้ใช้งานไม่ได้หากไม่ได้ใช้เครื่องหมายทับ ตัวอย่างเช่น: str = str.split ("\ n"). เข้าร่วม ("<br />");
ACOMIT001

@ ACOMIT001 ฉันเดาว่าขึ้นอยู่กับว่าสตริงมีบรรทัดใหม่หรือ blackslash และ n?
paulslater19

38

วิธีนี้ใช้สำหรับอินพุตที่มาจาก textarea

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

1
มันเป็นคำตอบที่ดีที่สุดสำหรับฉันเพราะคุณไม่ได้ลืม \ r ซึ่งใช้กับบางระบบ
Bartłomiej Zalewski

1
นี่คือคำตอบที่ดีที่สุดสำหรับคำถามนี้ แต่ฉันจะไปกับ <br> ไม่ใช่ <br /> ดูหนึ่งstackoverflow.com/questions/1946426/html-5-is-it-br-br-or-br
kheya

8

หากคำตอบที่ยอมรับไม่เหมาะกับคุณคุณอาจลอง

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

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


2
new RegExp('\n', 'g')เหมือนกับ/\n/g(ยกเว้นบาง minutiae เกี่ยวกับการใช้ตัวอักษรดั้งเดิมกับตัวสร้างของพวกเขา)
เปลือกตา

2
ไม่ว่าด้วยเหตุผลใดสิ่งนี้ใช้ได้สำหรับฉัน แต่คำตอบที่ยอมรับไม่ได้
nick

1
อ๊ะเหมือนกันที่นี่ ... แต่ความผิดพลาดของฉันพยายามที่จะระบุ/\n/gว่าเป็นสตริง!
Daniel Fortunov

7

โดยไม่คำนึงถึงระบบ:

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

1
ข้อควรระวัง: สิ่งนี้จะเพิ่มแท็ก '<br>' ลงในสตริงใด ๆ โดยไม่คำนึงว่ามี '\ n' อยู่ในนั้นหรือไม่
mkoeller

4

สิ่งสำคัญคือการเข้ารหัสข้อความที่เหลือเพื่อป้องกันการโจมตีจากการฉีดสคริปต์ที่เป็นไปได้

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

สำหรับผู้ที่ต้องการอนุญาตสูงสุด 2 <br>ในแถวคุณสามารถใช้สิ่งนี้:

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

บรรทัดแรก: การค้นหา\nหรือ\r\nที่อย่างน้อย 2 \n\n\n\nของพวกเขาอยู่ในแถวเช่น จากนั้นแทนที่ด้วย 2br

บรรทัดที่สอง: การค้นหาทั้งหมดเดียว\r\nหรือ\nและแทนที่ด้วย<br>


1

ถ้าคุณส่งตัวแปรจาก PHP คุณสามารถรับมันด้วยสิ่งนี้ก่อนที่จะส่ง:

$string=nl2br($string);

0

มันจะแทนที่บรรทัดใหม่ทั้งหมดด้วยตัวแบ่ง

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

หากคุณต้องการแทนที่บรรทัดใหม่ทั้งหมดด้วยบรรทัดเดียว

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

อ่านเพิ่มเติมเกี่ยวกับ Regex: https://dl.icewarp.com/online_help/203030104.htm สิ่งนี้จะช่วยคุณได้ทุกครั้ง


นอกจากนี้ยังเป็นไปได้ที่จะใช้ regex เช่นนี้str = str.replace(/\n+/g, '<br>')สำหรับกรณีที่สอง
Matteo Basso

0

ไม่ตอบคำถามเฉพาะ แต่ผมแน่ใจว่านี้จะช่วยให้ใครบางคน ...

หากคุณมีเอาต์พุตจาก PHP ที่คุณต้องการแสดงผลบนหน้าเว็บโดยใช้ JavaScript (อาจเป็นผลมาจากคำขอ Ajax) และคุณเพียงต้องการรักษาพื้นที่สีขาวและตัวแบ่งบรรทัดให้พิจารณาเพียงใส่ข้อความไว้ใน<pre></pre>บล็อก:

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

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