ใน Rails - มีวิธีการทางรถไฟในการแปลง newlines เป็น <br> หรือไม่?


115

มีวิธี Railsy ในการแปลง \ n เป็น<br>หรือไม่?

ตอนนี้ฉันทำแบบนี้:

mystring.gsub(/\n/, '<br>')

สอง / ตัวละครทำอะไร? ฉันใช้ "แทน
alamodey

สอง / ตัวอักษรบ่งบอกว่าเป็นประสบการณ์ปกติ
joshua.paling

คำตอบ:


260

ใช่รางมีsimple_formatสิ่งที่คุณกำลังมองหาและดีกว่าเล็กน้อยเนื่องจากเพิ่มแท็กย่อหน้าด้วย ดู

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

ตัวอย่าง:

 simple_format(mystring)

โปรดทราบว่าsimple_formatอนุญาตให้ใช้แท็ก HTML พื้นฐาน แต่ยังส่งผ่านข้อความsanitizeซึ่งจะลบสคริปต์ทั้งหมดดังนั้นจึงควรปลอดภัยสำหรับการป้อนข้อมูลของผู้ใช้


1
ขอบคุณ - ฉันควรจะรู้สิ่งนี้ - ฉันเคยใช้ simple_format ในโครงการอื่น ๆ
daustin777

3
ควรสังเกตว่าsimple_formatจะรวมข้อความที่ให้ไว้ใน<p>แท็กโดยอัตโนมัติและไม่สามารถหลีกเลี่ยงฟังก์ชันนี้ได้
Isaac Moore

1
simple_format มีความเสี่ยงด้านความปลอดภัยหากใช้สำหรับเว็บแอป มันขึ้นอยู่กับ Rails ตีความไวยากรณ์พิเศษเช่นjavascript:alert(\no!\)ที่ระบุในการอ้างอิง อาจมีรูปแบบที่ไม่สิ้นสุดและรูปแบบในอนาคตสำหรับแฮกเกอร์ที่เป็นอันตรายในการทำงานด้วย
Chloe

3
ตั้งแต่ราง 4 simple_format มีwrapper_tagตัวเลือกที่อนุญาตให้เปลี่ยน<p>แท็กสำหรับสิ่งอื่น
Lluís

41

คุณสามารถทำให้กว้างขึ้นได้โดยทำ:

mystring.gsub(/(?:\n\r?|\r\n?)/, '<br>')

วิธีนี้จะครอบคลุม DOS, * NIX, Mac และการลงท้ายบรรทัดที่ไม่ถูกต้องโดยไม่ได้ตั้งใจ


5
+1 สำหรับโซลูชันทั่วไปที่ไม่ใช่ทางรถไฟ ในฐานะนักพัฒนา Ruby ที่ไม่ชอบ Rails มีสิ่งเหล่านี้น้อยเกินไป
Winfield Trail

3
regex ดีขอบคุณ หากคุณต้องการทำสิ่งที่คล้ายกับที่simple_formatคุณสามารถแยกใน regex นั้นได้ให้ใช้mapเพื่อรวมสตริงในการเปิดและปิดpแท็กจากนั้นรวมเข้าด้วยกัน mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.joinควรทำแม้ว่าฉันจะไม่ได้ทดสอบก็ตาม
Brian Kung

เคล็ดลับที่ยอดเยี่ยม @BrianKung มันคือสิ่งที่ฉันกำลังมองหา!
alexventuraio

นอกจากนี้หากคุณต้องการให้แท็ก html <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>ที่สร้างความปลอดภัยในรางมุมมองเพียงแค่ทำอะไรเช่นนี้และยังให้คุณสามารถเพิ่มระดับสำหรับแต่ละรายการที่สร้าง: และมันใช้งานได้อย่างมีเสน่ห์ boohoo!
alexventuraio

แม้ว่าคำตอบนี้จะได้รับการโหวตค่อนข้างมาก แต่ฉันต้องการเพิ่มว่าสิ่งนี้มีความอ่อนไหวต่อการเขียนสคริปต์ข้ามไซต์ คุณสามารถทำได้ก็ต่อเมื่อคุณเชื่อถือข้อมูลที่ป้อน (เช่นไม่มีการป้อนข้อมูลของผู้ใช้) มิฉะนั้นmystringอาจมี HTML ที่กำหนดเอง
NobodysNightmare

29

คุณควรระมัดระวังในเรื่องนี้เมื่อคุณจัดการกับข้อมูลที่ผู้ใช้ป้อน
simple_formatแทรก<br>แท็ก แต่จะอนุญาตแท็ก html อื่น ๆ !

เมื่อใช้ simple_format <b>Hello</b>จะแสดงผลเป็น " สวัสดี " คุณอาจไม่ต้องการสิ่งนี้

แต่คุณสามารถใช้<%= h(c.text).gsub("\n", "<br>").html_safe %>
h()จะเข้ารหัส html ก่อนgsubแทนที่ตัวแบ่งบรรทัดและhtml_safeอนุญาตให้แสดง<br>แท็ก

สิ่งนี้จะแสดงสิ่งที่ผู้ใช้ป้อน นอกจากนี้ยังอนุญาตให้พูดคุยเกี่ยวกับ html ในความคิดเห็นเช่น


อ๋อ แบบนี้มันใช้งานได้และฉันต้องการเอาต์พุตเหมือนกับอินพุตพร้อมกับแสดงผลตอบแทน
ทิม

แม้ว่าsimple_formatจะอนุญาตให้ใช้แท็ก HTML พื้นฐาน แต่สิ่งสำคัญคือต้องทราบว่ามันส่งผ่านข้อความด้วยsanitizeซึ่งจะลบสิ่งที่อาจเป็นอันตรายออกไป apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy

โปรดทราบว่าแม้แต่ HTML ที่ผ่านการฆ่าเชื้อแล้วก็ยังอนุญาตให้มีลิงก์พื้นฐานได้ สามารถใช้ลิงก์เพื่อนำผู้ใช้ไปยังไซต์ฟิชชิง คุณต้องระมัดระวังเป็นพิเศษหากคุณแสดงข้อความที่ผู้ใช้สร้างขึ้นในอีเมลที่แอปพลิเคชันของคุณส่งมา
เจมส์

17

เพียงแค่ใช้

white-space: pre-line;

ใน css ของคุณและข้อความจะรวมอยู่ในตัวแบ่งบรรทัด


ใช่เพียง simple_format ใช้ไม่ได้กับฉันสำหรับกรณีขอบเช่นการเชื่อมต่อบรรทัดใหม่ต่างๆ เช่น \ r \ n \ r \ n
emaxi

1
โซลูชันที่สวยงามดีที่ทำสิ่งที่ OP ร้องขอและไม่มีอะไรเพิ่มเติม - ข้อความที่มีแท็ก html จะไม่แสดงเป็น html ในกรณีของฉันฉันต้องการให้เอาต์พุตตรงกับอินพุต (เช่น <b> </b> จะไม่แสดงข้อความเป็นตัวหนา
David

1

นอกจากนี้คุณอาจพิจารณาสิ่งที่คุณกำลังพยายามทำหากคุณจัดรูปแบบข้อความที่มีคนป้อนให้สวยงามคุณอาจพิจารณาตัวกรองเช่นMarkdownเพื่อให้ผู้ใช้ของคุณจัดรูปแบบข้อความโดยไม่ต้องเปิดเวิร์มที่เป็น HTML คุณก็รู้เหมือนอยู่ที่ Stack Overflow


0

Nope สิ่งที่คุณมีคือทางเลือกที่ใช้กันทั่วไป คำจำกัดความที่คนส่วนใหญ่ใช้คือ:

   def nl2br text
       text.gsub(/\n/, '<br/>')
   end

มันเป็นชื่อที่เป็นเช่นนี้เพราะมันเลียนแบบการทำงานของฟังก์ชั่น PHP โดยใช้ชื่อเดียวกัน


1
ฉันไม่ได้ลงคะแนน แต่ฉันจะอธิบายแบบนี้: คำตอบที่ไม่ได้คำนึงถึงบางอย่างเช่น simple_format ดูเหมือนจะไม่น่ารำคาญ แต่คำตอบที่มี "Nope" ในตอนแรกกีดกันผู้คนจากการมองไปไกลกว่านั้น
cesoid

0
mystring.gsub(/\r\n|\r|\n/, '\n')

ทำงานให้ฉัน


0

คุณสามารถทำได้simple_format(h(text))- hจะตรวจสอบให้แน่ใจว่าไม่มีการแสดง HTML ใด ๆ

ดังที่ได้กล่าวไว้ในคำตอบอื่น ๆ สิ่งนี้จะทำได้มากกว่าที่คุณขอเล็กน้อย จะรวมทุกอย่างไว้ใน<p>และเพิ่มย่อหน้าเพิ่มเติมหากคุณมีการขึ้นบรรทัดใหม่สองครั้งที่ใดก็ได้

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