Kết xuất một chuỗi trong HTML và giữ nguyên khoảng trắng và ngắt dòng


232

Tôi có một ứng dụng MVC3 có trang chi tiết. Là một phần trong đó tôi có một mô tả (lấy từ db) có khoảng trắng và dòng mới. Khi nó được kết xuất, các dòng và khoảng trắng mới bị html bỏ qua. Tôi muốn mã hóa các không gian và dòng mới để chúng không bị bỏ qua.

Làm thế nào để bạn làm điều đó?

Tôi đã thử HTML.Encode nhưng cuối cùng nó hiển thị mã hóa (và thậm chí không phải trên khoảng trắng và dòng mới mà trên một số ký tự đặc biệt khác)


Câu trả lời:


545

Chỉ cần phong cách nội dung với white-space: pre-wrap;.

div {
    white-space: pre-wrap;
}
<div>
This is some text   with some extra spacing    and a
few newlines along with some trailing spaces        
     and five leading spaces thrown in
for                                              good
measure                                              
</div>


1
+1 Giải pháp này sạch sẽ và tôi khuyên bạn nên sử dụng Phương thức SecurityEuity.Escape với nó.
Ryan Gates

@ user941632: Bạn phải có một số kiểu dáng khác ngăn nó hoạt động. Nó hoạt động trong một khoảng ở đây: jsfiddle.net/VwGSf/64
pete

43
white-space: pre-line;nếu bạn không muốn dòng đầu tiên của mỗi đoạn được thụt lề.
Will Schoenberger

4
Đây là một vé cũ nhưng vẫn có thể đáng để thêm một tài liệu tham khảo như MDN để giúp giải thích câu trả lời được phê duyệt đang làm gì :)
Phil D.

và nếu nó vẫn không giống như cách bạn muốn, hãy kiểm tra khoảng trắng giữa các phần tử html của bạn (hoặc thứ tạo ra chúng - ví dụ như mẫu vue) ...
Yordan Georgiev

43

bạn đã thử sử dụng <pre>thẻ.

http://jsfiddle.net/NweRa/


4
Điều đó sẽ hiển thị giá trị trong một phông chữ có chiều rộng cố định
Dan dot net

3
bạn có thể sử dụng css để thay đổi phong cách. tôi chỉ viết một ví dụ thực sự cơ bản. bạn có thể sử dụng thẻ <pre> hoặc sử dụng css theo câu trả lời của @ pete.
N30

19

Bạn có thể sử dụng khoảng trắng: dòng trước để duy trì ngắt dòng trong định dạng. Không cần phải chèn thủ công các phần tử html.

.popover {
    white-space: pre-line;    
}

hoặc thêm vào phần tử html của bạn style="white-space: pre-line;"


7

Bạn sẽ muốn thay thế tất cả các khoảng trắng bằng &amp;nbsp;( dấu cách không ngắt) và tất cả các dòng mới \nbằng <<b></b>br>(ngắt dòng trong html). Điều này sẽ đạt được kết quả mà bạn đang tìm kiếm.

body = body.replace(' ', &amp;nbsp;).replace('\n', '<<b></b>br>');

Một cái gì đó thuộc về bản chất đó.


Điều đó sẽ làm việc, tôi đoán tôi đã nghĩ rằng sẽ có một cái gì đó được xây dựng. Có lẽ tôi đang suy nghĩ quá mức về nó.
Dan dot net

Theo như tôi đã thấy thì không, nó không có nhiều chi phí để thực hiện một sự thay thế đơn giản. Tôi không nghĩ hiệu suất sẽ là một vấn đề.
Nhà phát triển

Tôi đoán 'vấn đề' với MVC là nếu tôi thay đổi chuỗi như bạn đề xuất, nó sẽ hiển thị '& nbsp;' thay vì khoảng trắng, trừ khi tôi sử dụng @ Html.Raw (). Sau đó, tôi phải quan tâm đến xss và người dùng nhập html xấu. Tuy nhiên tôi có thể mã hóa các chuỗi khi chèn để tôi có thể bớt lo lắng về điều đó.
Dan dot net

4

Tôi đã thử white-space: pre-wrap;kỹ thuật được nêu bởi pete nhưng nếu chuỗi liên tục và dài thì nó chỉ chạy ra khỏi container và không bị cong vênh vì bất kỳ lý do gì, đã không có nhiều thời gian để điều tra .. nhưng nếu bạn cũng đang có cùng một vấn đề, tôi đã kết thúc bằng cách sử dụng các <pre>thẻ và css sau đây và mọi thứ đều ổn.

pre {
font-size: inherit;
color: inherit;
border: initial;
padding: initial;
font-family: inherit;
}

1

Như bạn đã đề cập trong câu trả lời của @Developer, tôi có thể sẽ mã hóa HTML trên đầu vào của người dùng. Nếu bạn lo lắng về XSS, có lẽ bạn không bao giờ cần đầu vào của người dùng ở dạng ban đầu, vì vậy bạn cũng có thể thoát khỏi nó (và thay thế khoảng trắng và dòng mới trong khi bạn đang ở đó).

Lưu ý rằng thoát trên đầu vào có nghĩa là bạn nên sử dụng @ Html.Raw hoặc tạo MvcHtmlString để hiển thị đầu vào cụ thể đó.

Bạn cũng có thể thử

System.Security.SecurityElement.Escape(userInput)

nhưng tôi nghĩ nó cũng sẽ không thoát khỏi không gian. Vì vậy, trong trường hợp đó, tôi khuyên bạn chỉ nên làm một .NET

System.Security.SecurityElement.Escape(userInput).Replace(" ", "&nbsp;").Replace("\n", "<br>")

về đầu vào của người dùng. Và nếu bạn muốn tìm hiểu sâu hơn về khả năng sử dụng, có lẽ bạn có thể thực hiện phân tích cú pháp XML của đầu vào của người dùng (hoặc chơi với các biểu thức thông thường) để chỉ cho phép một bộ thẻ được xác định trước. Chẳng hạn, cho phép

<p>, <span>, <strong>

... nhưng không cho phép

<script> or <iframe>

0

Gói mô tả trong một textareayếu tố.


0

Có một cách đơn giản để làm điều đó. Tôi đã thử nó trên ứng dụng của tôi và nó hoạt động khá tốt.

Chỉ cần gõ: $ text = $ row ["text"]; echo nl2br ($ văn bản);

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.