2012-06-03 21 views
5

Mục tiêu của tôi là tìm một cái gì đó như 'b1234' trong một đoạn văn và thay thế bằng:cách chính xác để làm tìm một mô hình và thay thế bằng một liên kết trong một cái nhìn Rails

<a href=http://bugtracker.com/bug/1234>b1234</a> 

Tôi làm điều này bằng ruby ​​đơn giản :

"I fixed b1234 today".gsub(/(b([0-9]+))/i, '<a href=http://bugtracker.com/bug/\2>\1</a>') 

Nó ra:

=> "I fixed <a href=http://bugtracker.com/bug/1234>b1234</a> today" 

tôi đã sau trong đường ray của tôi xem:

<%= post.content %> 

Lưu ý: Tôi không lưu trữ mã liên kết HTML trong DB khi bài đăng được tạo.

Nếu tôi làm:

<%= post.content.gsub(...) %> 

tôi nhận được thoát html trong file đầu ra:

&lt;a href= ... instead of <a href= ... 

... Và Tôi muốn rằng hành vi, tôi không muốn người dùng đăng HTML (iframe sẽ đáng sợ!).

Nhưng, làm cách nào tôi vẫn có thể tìm và thay thế chức năng mà tôi muốn mà không phải hy sinh bảo mật? Có lẽ một cách tiếp cận Javascript?

Cảm ơn!

Trả lời

4

Tăng gấp đôi ký hiệu bằng. <%== post.content.gsub(...) %>. Nếu người dùng cũng có khả năng viết HTML trong nội dung này, thì bạn sẽ cần phải Sanitize, để chỉ cho phép các thẻ HTML được chỉ định.

EDIT | Trên thực tế, với điều kiện các chuỗi tìm kiếm bạn đang thay thế không chứa các ký tự đặc biệt HTML, bạn chỉ có thể thoát khỏi chuỗi, sau đó làm gsub:

<%== h(post.content).gsub(...) %> 
+0

Đó là dòng cuối cùng của mã là hoàn hảo tinh khiết! Cảm ơn bạn. – cnandreu

+0

Có lẽ bạn nên trích xuất mã này thành một hàm trợ giúp để dễ dàng kiểm tra, sử dụng lại và hiểu. –

Các vấn đề liên quan