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 메서드 를 사용하는 것이 좋습니다 .
Ryan Gates

@ user941632 : 다른 스타일이 있어야 작동하지 않습니다. 그것은 여기 범위에서 작동 : jsfiddle.net/VwGSf/64
피트

43
white-space: pre-line;각 단락의 첫 줄을 들여 쓰지 않으려면
Will Schoenberger

4
이것은 오래된 티켓이지만 MDN 과 같은 참조를 추가 하여 승인 된 답변이 무엇을 수행하는지 설명하는 데 도움이 될 수 있습니다. :)
Phil D.

그래도 원하는 방식으로 보이지 않으면 html 요소 (또는 예를 들어 vue 템플릿) 사이의 공백을 확인하십시오.
Yordan Georgiev

43

<pre>태그를 사용해 보셨습니까?

http://jsfiddle.net/NweRa/


4
그 표시 값을 고정 폭 글꼴로
댄 닷 넷

3
CSS를 사용하여 스타일을 변경할 수 있습니다. 방금 정말 기본적인 예를 썼습니다. @pete의 답변에 따라 <pre> 태그를 사용하거나 CSS를 사용할 수 있습니다.
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>');

그 자연의 무언가.


그것은 효과가있을 것입니다. 나는 무언가 내장되어있을 것이라고 생각한 것 같습니다.
Dan dot net

내가 본 한, 간단한 교체를 수행하는 것은 많은 오버 헤드가 아닙니다. 나는 성능이 문제가 될 것이라고 생각하지 않습니다.
개발자

MVC의 '문제'는 문자열을 변경하면 '& nbsp;'가 표시된다는 것입니다. @ Html.Raw ()를 사용하지 않으면 공백 대신에. 그런 다음 xss와 사용자가 잘못된 HTML을 입력하는 것에 대해 걱정해야합니다. 그러나 삽입에 문자열을 인코딩하여 걱정하지 않아도됩니다.
Dan dot net

4

나는 white-space: pre-wrap;pete에 의해 기술 된 기술 을 시도 했지만 문자열이 연속적이고 길면 컨테이너가 다 떨어지고 어떤 이유로 든 뒤 틀리지 않았지만 조사 할 시간이 많지 않았습니다 . 같은 문제로 <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 ($ text);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.