레일스-개행 문자를 <br>로 변환하는 레일 방법이 있습니까?


115

\ n을 변환하는 Railsy 방법이 <br>있습니까?

현재 다음과 같이하고 있습니다.

mystring.gsub(/\n/, '<br>')

두 / 캐릭터는 무엇을합니까? 대신 "를 사용합니다.
alamodey

두 / 문자는이 정규식 포함의 표시
joshua.paling

답변:


260

예, rails는 simple_format당신이 찾고있는 것을 정확히하고 단락 태그를 추가하기 때문에 약간 더 좋습니다. 보다

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

예:

 simple_format(mystring)

simple_format기본 HTML 태그 를 허용하지만 sanitize모든 스크립트를 제거하는 텍스트도 전달 하므로 사용자 입력에 안전해야합니다.


1
감사합니다. 저는 이것을 알았어 야했습니다. 다른 프로젝트에서 simple_format을 사용했습니다.
daustin777

3
simple_format제공된 텍스트를 <p>태그로 자동으로 래핑하며이 기능을 피할 수 없다는 점에 유의해야합니다 .
이삭 무어

1
simple_format은 웹 앱에 사용하는 경우 보안 위험입니다. 그것은 javascript:alert(\no!\)참조에 주어진 것과 같은 특별한 구문을 해석하는 Rails에 의존합니다 . 악의적 인 해커가 작업 할 수있는 무한한 변형과 ​​향후 변형이있을 수 있습니다.
Chloe

3
4 레일 이후, simple_format는이 wrapper_tag변화 할 수 있도록 옵션을 <p>다른 용도 태그
루이스

41

다음을 수행하여 더 일반적으로 만들 수 있습니다.

mystring.gsub(/(?:\n\r?|\r\n?)/, '<br>')

이렇게하면 DOS, * NIX, Mac 및 실수로 인한 잘못된 줄 끝을 다룰 수 있습니다.


5
일반화 된 비철도 솔루션의 경우 +1입니다. Rails를 좋아하지 않는 Ruby 개발자에게는 이러한 것들이 너무 적습니다.
Winfield Trail

3
좋은 정규식, 감사합니다. 비슷한 작업을 수행 simple_format하려면 해당 정규식에서 분할 할 수 있습니다.를 사용 map하여 여는 p태그 와 닫는 태그로 문자열을 감은 다음 조인하십시오. mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.join나는 그것을 테스트하지는 않았지만 그것을해야합니다.
Brian Kung

@BrianKung의 훌륭한 트릭은 내가 찾던 바로 그것이었습니다!
alexventuraio

또한 생성 된 html 태그를 rails보기에서 안전하게 만들려면 다음과 같이 수행하고 생성 된 각 항목에 대한 클래스를 추가 할 수도 있습니다 <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>.. 그리고 그것은 매력 부후처럼 작동합니다!
alexventuraio

이 답변은 상당히 많이 찬성되었지만 교차 사이트 스크립팅에 취약하다는 점을 추가하고 싶습니다. 입력을 신뢰하는 경우에만 수행 할 수 있습니다 (즉, 사용자 입력이 없음). 그렇지 않으면 mystring임의의 HTML이 포함될 수 있습니다.
NobodysNightmare

29

사용자 입력을 처리 할 때주의해야합니다. 태그를
simple_format삽입 <br>하지만 다른 HTML 태그를 허용합니다 !

simple_format을 사용하면 <b>Hello</b>" Hello " 로 렌더링되므로 원하지 않을 수 있습니다.

대신 <%= h(c.text).gsub("\n", "<br>").html_safe %>
h()html을 먼저 인코딩 gsub하고 줄 바꿈을 대체 html_safe하고<br> 태그가 표시 될 수 있습니다.

사용자가 입력 한 내용이 정확히 표시됩니다. 예를 들어 주석에서 html을 토론 할 수도 있습니다.


네. 이와 같이 작동하며 입력과 같은 출력을 원합니다.
Tim

simple_format기본 HTML 태그를 허용 하지만을 통해 텍스트도 전달하므로 sanitize잠재적으로 악의적 일 수있는 모든 항목이 제거 된다는 점에 유의해야합니다 . apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy

정리 된 HTML조차도 기본 링크를 허용한다는 점에 유의하는 것이 중요합니다. 링크를 사용하여 사용자를 피싱 사이트로 유도 할 수 있습니다. 애플리케이션에서 보낸 이메일에 사용자 생성 메시지를 표시하는 경우 특히주의해야합니다.
James

17

간단히 사용

white-space: pre-line;

CSS에서 텍스트는 줄 바꿈으로 줄 바꿈됩니다.


예, simple_format은 다양한 줄 바꿈을 연결하는 것과 같은 가장자리 경우에 작동하지 않습니다. 예 : \ r \ n \ r \ n
emaxi

1
OP가 요청하는 것을 정확히 수행하는 멋진 솔루션이며 그 이상은 없습니다. html 태그가있는 텍스트는 html로 렌더링되지 않습니다. 제 경우에는 출력이 입력과 정확히 일치하기를 원했습니다 (예 : <b> </ b>는 텍스트를 굵게 표시하지 않습니다.
David

1

당신은 또한 당신이하려는 일을 고려할 수 있습니다. 사람들이 입력 한 텍스트의 서식을 멋지게 지정하고 있다면, 사용자가 HTML 인 웜을 열지 않고 텍스트 서식을 지정할 수 있도록하는 Markdown 과 같은 필터를 고려할 수 있습니다. 여기 Stack Overflow에있는 것처럼 요.


0

아니. 당신이 가지고있는 것은 일반적으로 사용되는 대안입니다. 대부분의 사람들이 사용하는 정의는 다음과 같습니다.

   def nl2br text
       text.gsub(/\n/, '<br/>')
   end

같은 이름으로 PHP 함수 의 기능을 모방하기 때문에 이름이 붙여졌습니다 .


1
저는 반대표를 던지지 않았지만 다음과 같이 설명하겠습니다. simple_format과 같은 것을 고려하지 않는 대답은 귀찮게 보이지 않지만 확실한 "아니오"를 가진 대답입니다. 처음에는 사람들이 더 이상 보지 못하게합니다.
cesoid

0
mystring.gsub(/\r\n|\r|\n/, '\n')

나를 위해 일했다


0

넌 할 수있어 simple_format(h(text))h 어떤 HTML 렌더링되지 않도록합니다.

다른 답변에서 언급했듯이 이것은 귀하가 요청한 것보다 조금 더 많은 일을 할 것입니다. 모든 것을으로 감싸고 <p>어디에서나 이중 줄 바꿈이 있으면 더 많은 단락을 추가합니다.

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