Trong Rails - có phương pháp rails để chuyển đổi dòng mới thành <br> không?


115

Có cách nào để chuyển đổi \ n thành <br>?

Hiện tại, tôi đang làm như thế này:

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

Hai / nhân vật làm gì? Tôi sử dụng "thay vào đó.
alamodey

Hai / ký tự cho biết đó là một biểu hiện thường xuyên
joshua.paling

Câu trả lời:


260

Vâng, đường ray có simple_formatchính xác những gì bạn đang tìm kiếm, và tốt hơn một chút vì nó cũng thêm các thẻ đoạn văn. Xem

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

Thí dụ:

 simple_format(mystring)

Lưu ý rằng simple_formatcho phép các thẻ HTML cơ bản, nhưng cũng chuyển văn bản qua sanitizeđó loại bỏ tất cả các tập lệnh, vì vậy nó sẽ an toàn cho đầu vào của người dùng.


1
Cảm ơn- Tôi nên biết điều này- Tôi đã sử dụng Simple_format trong các dự án khác.
daustin777

3
Cần lưu ý rằng simple_formattự động bao bọc văn bản được cung cấp trong <p>thẻ và không thể tránh được chức năng này.
Isaac Moore

1
Simple_format là rủi ro bảo mật nếu sử dụng nó cho một ứng dụng web. Nó dựa vào Rails diễn giải cú pháp đặc biệt javascript:alert(\no!\)như được đưa ra trong tài liệu tham khảo. Có thể có các biến thể vô tận và các biến thể trong tương lai cho các tin tặc độc hại để làm việc với.
Chloe

3
kể từ rails 4, Simple_format có wrapper_tagtùy chọn cho phép thay đổi <p>thẻ cho bất cứ điều gì khác
Lluís

41

Bạn có thể làm cho nó tổng quát hơn bằng cách làm:

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

Bằng cách này, bạn sẽ bao gồm DOS, * NIX, Mac và các kết thúc dòng không hợp lệ ngẫu nhiên.


5
+1 cho giải pháp tổng quát, không Rails. Là một nhà phát triển Ruby không thích Rails, có quá ít trong số này.
Đường mòn Winfield

3
Regex tốt đẹp, cảm ơn. Nếu bạn muốn làm một cái gì đó tương tự như simple_formatbạn có thể tách trên regex đó, hãy sử dụng mapđể bọc các chuỗi trong việc mở và đóng pthẻ, sau đó nối chúng lại. mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.joinnên làm điều đó, mặc dù tôi đã không kiểm tra nó.
Brian Kung

Thủ thuật tuyệt vời @BrianKung đó chính xác là những gì tôi đang tìm kiếm!
alexventuraio

Ngoài ra nếu bạn muốn làm cho các thẻ html được tạo an toàn trong chế độ xem đường ray, chỉ cần làm một cái gì đó như thế này và bạn cũng có thể thêm một lớp cho mỗi mục được tạo : <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>. Và nó hoạt động như một boohoo quyến rũ!
alexventuraio

Mặc dù câu trả lời này được nâng cấp khá nhiều, tôi muốn thêm rằng điều này dễ bị kịch bản chéo trang. Bạn chỉ có thể làm điều đó, nếu bạn tin tưởng đầu vào (tức là không có đầu vào của người dùng). Mặt khác mystringcó thể chứa HTML tùy ý.
NobodysNightmare

29

Bạn nên cẩn thận với điều này khi bạn đang làm việc với đầu vào của người dùng.
simple_formatchèn <br>thẻ nhưng nó sẽ cho phép các thẻ html khác !

Khi sử dụng Simple_format, <b>Hello</b>sẽ được hiển thị là " Xin chào ", bạn có thể không muốn điều này.

Thay vào đó, bạn có thể sử dụng <%= h(c.text).gsub("\n", "<br>").html_safe %>
h()sẽ mã hóa html trước, gsubthay thế ngắt dòng và html_safecho phép các <br>thẻ được hiển thị.

Điều này sẽ hiển thị chính xác những gì người dùng đã nhập. Nó cũng cho phép thảo luận về html trong các bình luận.


Vâng. như thế này, nó hoạt động và tôi muốn đầu ra giống như đầu vào, với lợi nhuận được hiển thị.
Tim

Mặc dù simple_formatcho phép các thẻ HTML cơ bản, điều quan trọng cần lưu ý là nó cũng chuyển văn bản qua sanitize, loại bỏ bất kỳ thứ gì có khả năng gây hại. apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy

Điều quan trọng cần lưu ý là ngay cả HTML được khử trùng cũng cho phép các liên kết cơ bản. Một liên kết có thể được sử dụng để hướng người dùng đến một trang web lừa đảo. Bạn phải đặc biệt cẩn thận với điều này nếu bạn đang hiển thị một tin nhắn do người dùng tạo trong email được gửi bởi ứng dụng của bạn.
James

17

Đơn giản chỉ cần sử dụng

white-space: pre-line;

trong css và văn bản của bạn sẽ bao gồm các ngắt dòng.


Vâng, Simple_format không hoạt động với tôi đối với các trường hợp cạnh như có nhiều dòng mới được nối với nhau. ví dụ: \ r \ n \ r \ n
emaxi

1
giải pháp thanh lịch tốt đẹp thực hiện chính xác những gì OP yêu cầu và không có gì hơn - văn bản với các thẻ html sẽ không được hiển thị dưới dạng html. trong trường hợp của tôi, tôi muốn đầu ra khớp chính xác với đầu vào (ví dụ <b> </ b> sẽ không hiển thị văn bản in đậm.
David

1

Bạn cũng có thể xem xét những gì bạn đang cố gắng thực hiện - nếu bạn định dạng tốt văn bản mà mọi người đã nhập, bạn có thể xem xét một bộ lọc như Markdown để cho phép người dùng định dạng văn bản của họ mà không cần mở hộp giun là HTML. Bạn biết đấy, giống như nó ở đây tại Stack Overflow.


0

Không. Những gì bạn có đó là sự thay thế thường được sử dụng. Định nghĩa hầu hết mọi người sử dụng là:

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

Nó được đặt tên như vậy vì nó bắt chước chức năng của hàm PHP cùng tên .


1
Tôi đã không đánh giá thấp, nhưng tôi đã giải thích cho họ theo cách này: Một câu trả lời không tính đến thứ gì đó như Simple_format có vẻ không gây khó chịu, nhưng một câu có "Nope" dứt khoát. lúc đầu không khuyến khích mọi người tìm kiếm thêm nữa.
Caesoid

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

đã làm cho tôi


0

Bạn có thể làm simple_format(h(text))-h sẽ đảm bảo mọi HTML không được hiển thị.

Như đã đề cập trong các câu trả lời khác, điều này sẽ làm nhiều hơn một chút so với bạn yêu cầu. Nó kết thúc toàn bộ nội dung <p>và thêm nhiều đoạn nếu bạn có gấp đôi dòng mới ở bất cứ đâu.

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.