Візуалізуйте рядок у HTML та збережіть пробіли та рядки


232

У мене є додаток MVC3, на якому є сторінка з деталями. В рамках цього у мене є опис (отриманий з db) з пробілами та новими рядками. Після його надання нові рядки та пробіли ігноруються html. Я хотів би кодувати ці пробіли та нові рядки, щоб вони не були проігноровані.

Як ти це робиш?

Я спробував HTML.Encode, але він виявив кодування (і навіть не на пробілах та нових рядках, а на деяких інших спеціальних символах)


Відповіді:


544

Просто стилюйте вміст 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 Це рішення є чистим, і я рекомендую використовувати для нього метод SecurityElement.Escape .
Райан Гейтс

@ user941632: у вас повинен бути інший стиль, що запобігає його роботі. Він працює в прольоті тут: jsfiddle.net/VwGSf/64
Піта

43
white-space: pre-line;якщо ви не хочете, щоб перший рядок кожного абзацу був відступним.
Буде Шенбергер

4
Це старий квиток, але, можливо, все-таки варто додати посилання на зразок MDN, щоб пояснити, що робить схвалена відповідь :)
Філ Д.

і якщо воно все ще не виглядає так, як ви хочете, перевірити пробіл між вашими html-елементами (або тим, що їх генерує - наприклад, шаблон vue) ...
Йордан Георгієв,

43

ви спробували використовувати <pre>тег.

http://jsfiddle.net/NweRa/


4
Це відображає значення шрифтом фіксованої ширини
Дан крапкою

3
ви можете використовувати css для зміни стилю. я щойно написав дійсно основний приклад. ви можете використовувати тег <pre> або використовувати css відповідно до відповіді @ pete.
N30,

19

Ви можете використовувати пробіл: передрядковий рядок для збереження розривів рядків у форматуванні. Немає необхідності вручну вставляти html елементи.

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

або додати до свого html-елемента style="white-space: pre-line;"


7

Ви хочете замінити всі пробіли на &amp;nbsp;(нерозривний пробіл) і всі нові рядки \nна <<b></b>br>(розрив рядка в HTML). Це повинно досягти результату, який ви шукаєте.

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

Щось такого характеру.


Це би спрацювало, я думаю, я думав, що щось буде вбудоване. Можливо, я переосмислюю це.
Дан крапком

Наскільки я бачив, що це не так, хоча не просто накладні витрати, хоча зробити просту заміну. Я не думаю, що продуктивність буде проблемою.
Розробник

Я думаю, що "проблема" з MVC полягає в тому, що якщо я зміню рядок, як ви запропонуєте, вона відобразить "& nbsp;" замість пробілів, якщо я не використовую @ Html.Raw (). Тоді я повинен бути стурбований xss та користувачем, який вводить поганий HTML. Однак я міг закодувати рядки на вставці, щоб я міг менше турбуватися про це.
Дан крапком

4

Я намагався white-space: pre-wrap;описати метод Піта, але якщо рядок був безперервним і довгим, він просто витік з контейнера і не викривився з будь-якої причини, не мав би часу на дослідження .. але якщо у вас теж є та сама проблема, я в кінцевому підсумку використовував <pre>теги та наступний css, і все було добре.

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

1

Як ви вже згадували у відповіді @Developer, я, мабуть, кодував HTML на введенні користувача. Якщо ви переживаєте за XSS, вам, ймовірно, ніколи не потрібні дані користувача у його первісному вигляді, тому ви можете також уникнути цього (і замінити пробіли та нові рядки, поки ви знаходитесь у ньому).

Зауважте, що біг при введенні означає, що вам слід або використовувати @ Html.Raw, або створити MvcHtmlString для візуалізації цього конкретного вводу.

Ви також можете спробувати

System.Security.SecurityElement.Escape(userInput)

але я думаю, що це не уникне місця. Тож у такому випадку я пропоную просто зробити .NET

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

на введення користувача. І якщо ви хочете заглибитися в зручність використання, можливо, ви можете зробити XML-аналіз синтаксису вводу користувача (або грати з регулярними виразами), щоб дозволити лише заздалегідь заданий набір тегів. Наприклад, дозволити

<p>, <span>, <strong>

... але не дозволяти

<script> or <iframe>


0

Існує простий спосіб зробити це. Я спробував це на своєму додатку, і він працював досить добре.

Просто введіть: $ text = $ row ["text"]; echo nl2br ($ текст);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.