Renderizza una stringa in HTML e conserva spazi e interruzioni di riga


233

Ho un'app MVC3 che ha una pagina dei dettagli. Come parte di ciò ho una descrizione (recuperata da un db) che ha spazi e nuove linee. Quando viene renderizzato, le nuove linee e gli spazi vengono ignorati dall'html. Vorrei codificare quegli spazi e nuove linee in modo che non vengano ignorati.

Come si fa a farlo?

Ho provato HTML.Encode ma alla fine ho visualizzato la codifica (e nemmeno sugli spazi e sulle nuove linee ma su alcuni altri caratteri speciali)


Risposte:


546

Dai uno stile al contenuto con 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 Questa soluzione è pulita e consiglierei di utilizzare il metodo SecurityElement.Escape con esso.
Ryan Gates,

@ user941632: è necessario disporre di altri stili per impedirne il funzionamento. Funziona in un arco di tempo qui: jsfiddle.net/VwGSf/64
pete

44
white-space: pre-line;se non si desidera rientrare nella prima riga di ogni paragrafo.
Will Schoenberger, il

4
Questo è un vecchio biglietto ma potrebbe comunque valere la pena aggiungere un riferimento come MDN per aiutare a spiegare cosa sta facendo la risposta approvata :)
Phil D.

e se continua a non sembrare nel modo desiderato, controlla lo spazio bianco tra i tuoi elementi html (o la cosa che li genera - ad esempio un modello di vue) ...
Yordan Georgiev

43

hai provato a usare il <pre>tag.

http://jsfiddle.net/NweRa/


4
Questo visualizza il valore in un carattere a larghezza fissa
Dan dot net

3
puoi usare css per cambiare lo stile. ho appena scritto un esempio molto semplice. puoi usare il tag <pre> o usare css secondo la risposta di @ pete.
N30,

20

È possibile utilizzare white-space: pre-line per preservare le interruzioni di riga nella formattazione. Non è necessario inserire manualmente elementi html.

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

o aggiungi al tuo elemento html style="white-space: pre-line;"


7

Si desidera sostituire tutti gli spazi con &amp;nbsp;(spazio non interruzione ) e tutte le nuove linee \ncon <<b></b>br>(interruzione di riga in html). Questo dovrebbe raggiungere il risultato che stai cercando.

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

Qualcosa di quella natura.


Funzionerebbe, immagino che stavo pensando che ci sarebbe qualcosa incorporato. Forse sto pensando troppo.
Dan dot net

Per quanto ho visto non c'è, tuttavia non è molto costoso fare una semplice sostituzione. Non penso che le prestazioni sarebbero un problema.
Sviluppatore

Immagino che il 'problema' con MVC sia che se cambio la stringa mentre mi suggerisci che visualizzerà '& nbsp;' invece degli spazi, a meno che io non usi @ Html.Raw (). Quindi devo preoccuparmi di xss e l'utente che inserisce HTML non valido. Potrei tuttavia codificare le stringhe su insert in modo da potermi preoccupare di meno.
Dan dot net

4

Stavo provando la white-space: pre-wrap;tecnica dichiarata da Pete, ma se la stringa era continua e lunga è rimasta fuori dal contenitore e non si è deformata per nessun motivo, non ho avuto molto tempo per indagare .. ma se anche tu hai il stesso problema, ho finito per usare i <pre>tag e i seguenti css e tutto è andato bene ..

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

1

Come hai detto nella risposta di @Developer, probabilmente codificherei HTML sull'input dell'utente. Se sei preoccupato per XSS, probabilmente non avrai mai bisogno dell'input dell'utente nella sua forma originale, quindi potresti anche sfuggirlo (e sostituire spazi e newline mentre ci sei).

Nota che l'escape sull'input significa che dovresti usare @ Html.Raw o creare un MvcHtmlString per rendere quel particolare input.

Puoi anche provare

System.Security.SecurityElement.Escape(userInput)

ma penso che non sfuggirà nemmeno agli spazi. Quindi in quel caso, suggerisco di fare semplicemente un .NET

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

su input dell'utente. E se vuoi scavare più a fondo nell'usabilità, forse puoi fare un'analisi XML dell'input dell'utente (o giocare con espressioni regolari) per consentire solo un set predefinito di tag. Ad esempio, consenti

<p>, <span>, <strong>

... ma non permettere

<script> or <iframe>

0

Avvolgere la descrizione in un textareaelemento.


0

C'è un modo semplice per farlo. L'ho provato sulla mia app e ha funzionato abbastanza bene.

Basta digitare: $ text = $ row ["text"]; echo nl2br ($ text);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.