HTML'de bir dize oluşturma ve boşlukları ve satır aralıklarını koruma


232

Bir ayrıntılar sayfası olan bir MVC3 uygulaması var. Bunun bir parçası olarak boşlukları ve yeni satırları olan bir açıklama (bir db alınan) var. Oluşturulduğunda, yeni çizgiler ve boşluklar html tarafından yoksayılır. Bu boşlukları ve yeni satırları göz ardı edilmeyecek şekilde kodlamak istiyorum.

Bunu nasıl yaptın?

HTML.Encode'u denedim ama kodlamayı görüntüledi (ve hatta boşluklarda ve yeni satırlarda değil, diğer bazı özel karakterlerde)


Yanıtlar:


544

Sadece içerik ile stil 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 Bu çözüm temiz ve onunla birlikte SecurityElement.Escape Yöntemini kullanmanızı tavsiye ederim .
Ryan Gates

@ user941632: Çalışmasını engelleyen başka bir stiliniz olmalı. Burada bir açıklık içinde çalışır: jsfiddle.net/VwGSf/64
pete

43
white-space: pre-line;her paragrafın ilk satırının girintili olmasını istemiyorsanız.
Will Schoenberger

4
Bu eski bir bilet, ancak onaylanan cevabın ne yaptığını açıklamaya yardımcı olması için MDN gibi bir referans eklemeye değebilir :)
Phil D.

ve hala istediğiniz şekilde görünmüyorsa, html öğeleriniz arasındaki boşluğu kontrol edin (veya onları üreten şey - örneğin bir vue şablonu) ...
Yordan Georgiev

43

<pre>etiketini kullanmayı denediniz mi ?

http://jsfiddle.net/NweRa/


4
Bu, değeri sabit genişlikli bir yazı tipinde görüntüler
Dan dot net

3
stili değiştirmek için css kullanabilirsiniz. Gerçekten çok basit bir örnek yazdım. <pre> etiketini kullanabilir veya @ pete'nin cevabına göre css kullanabilirsiniz.
N30

19

Biçimlendirmedeki satır sonlarını korumak için beyaz boşluk: ön çizgi kullanabilirsiniz. Html öğelerini manuel olarak eklemenize gerek yoktur.

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

veya html öğenize ekleyin style="white-space: pre-line;"


7

Sen tüm boşlukların yerine isteyeyim &amp;nbsp;(bölünemez boşluk) ve tüm yeni hatlar \nile <<b></b>br>(html içinde satır sonu). Bu, aradığınız sonucu elde etmelidir.

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

O doğanın bir şeyi.


Bu işe yarayacaktı, sanırım yerleşik bir şey olacağını düşünüyordum. Belki de aşırı düşünüyorum.
Dan dot net

Gördüğüm kadarıyla, basit bir değiştirme yapmak için çok fazla yük değil. Performansın bir sorun olacağını düşünmüyorum.
Geliştirici

Ben MVC ile 'sorun' sanırım önerdiğim gibi dizeyi değiştirmek '& nbsp;' boşluklar yerine @ Html.Raw () kullanmadıkça. Sonra xss ve kötü html giren kullanıcı hakkında endişe gerekir. Ancak ben bu konuda daha az endişe böylece insert dizeleri kodlamak olabilir.
Dan dot net

4

Deniyordum white-space: pre-wrap;Pete belirttiği teknik ancak dize sürekli olsaydı ve uzun sadece kabın bitti ve sebebi ne olursa olsun, için çözgü vermedi araştırmak için çok zaman yoktu sen de yaşıyorsanız .. ama aynı sorun, ben <pre>etiketleri ve aşağıdaki css kullanarak sona erdi ve her şey iyi oldu ..

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

1

@Developer 'ın cevabında bahsettiğiniz gibi, muhtemelen kullanıcı girişinde HTML kodlaması yapacağım. XSS hakkında endişeleniyorsanız, muhtemelen kullanıcının girişine asla orijinal biçiminde ihtiyacınız yoktur, bu yüzden de kaçabilirsiniz (ve siz boşluktayken boşlukları ve yeni satırları değiştirin).

Girişten kaçmanın, @ Html.Raw kullanmanız veya belirli bir girişi oluşturmak için bir MvcHtmlString oluşturmanız gerektiği anlamına geldiğini unutmayın.

Ayrıca deneyebilirsiniz

System.Security.SecurityElement.Escape(userInput)

ama bence uzaydan da kaçmayacak. Bu durumda, sadece bir .NET

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

kullanıcı girişinde. Kullanılabilirliği daha derinlemesine incelemek istiyorsanız, yalnızca önceden tanımlanmış bir etiket kümesine izin vermek için kullanıcının girişinin XML ayrıştırmasını (veya normal ifadelerle oynayabilirsiniz) yapabilirsiniz. Örneğin,

<p>, <span>, <strong>

... ama izin verme

<script> or <iframe>


0

Bunu yapmanın basit bir yolu var. Uygulamamda denedim ve oldukça iyi çalıştı.

Sadece şunu yazın: $ text = $ row ["text"]; echo nl2br ($ text);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.