2012-02-26 3 views
3

사용자가 데이터베이스에 기사를 제출할 수 있도록 시스템을 설정했습니다. HTML이기 때문에 개행이있을 때마다 <br />을 입력 할 것을 기대하고 싶지 않으므로 입력에 PHP 함수 nl2br()을 사용하고 있습니다.PHP에서 제출 된 텍스트의 개행 문자 변환

또한 기사 수정 도구를 제공하고 있습니다.이 도구는 기사를 다시 양식으로 가져오고 (다른 페이지이지만) 편집 할 수있게합니다. 이렇게하면 <br /> 요소도 나타납니다 (줄 바꿈이 여전히 있음).
요소를 수정하려면 (어쨌든 내가 예상 했었지만)이 사이트의 다른 질문에서 찾은 preg_replace('/<br(\s+)?\/?>/i', "\n", mysql_result($result,$i,"content"))을 추가했습니다. <br /> 요소를 제거하는 일을하지만, 줄 바꿈으로 바뀌므로 줄 바꾸기가 원래대로 유지되므로 게시물을 편집 할 때마다 더 많은 줄 바꿈이 추가되어 단락이 점점 더 간격을 띄웁니다 매번. 이것은 사용자가 이해하지 못하는 것입니다. 예를 들어

, 나는이 문서 제출 양식에 다음을 입력 말 :

Hello, this is my article. 
I am demonstrating a new line here. 

이 변환됩니다에 : 개행 문자가, 전환에도 불구하고 있음을

Hello, this is my article.<br /> 
I am demonstrating a new line here. 

공지 사항 본문의 개행 문자입니다. 편집 형태에서, <br />는 개행 문자로 다시 변환됩니다와 같이 다음 <br />가 개행 문자로 변환 된

Hello, this is my article. 

I am demonstrating a new line here. 

때문에,하지만 줄 바꿈이 이미 있었다.

내가 궁금하네요
Hello, this is my article.<br />I am demonstrating a new line here. 

... 원래 줄 바꿈을 유지에서 nl2br() 기능을 중지하는 방법이 : 그래서 나는 원래 이런 식으로 뭔가로 변환 할 수 있도록 내가 무엇을 기대하고있어 것 같아요? Windows \r\n 문자와 관련이 있을까요?

+2

사용자가 HTML을 신뢰할 수 있고 신뢰할만한 사람이 아니라면 심각한 문제가 될 것입니다. 왜냐하면 사람들이 웹 사이트에 HTML을 업로드하도록 허용한다면, 대부분 필터링되지 않기 때문에, XSS의 구멍이 넓어지고 사회 공학 엔트리 포인트가 생겨날 수 있기 때문입니다. – tdammers

+2

왜 기사를 처음 제출할 때 새 줄을
으로 변환해야합니까? 기사를 표시 할 때 서식을 지정할 수 있습니다. –

+0

@tdammers 지금 필터링하지 않는 유일한 이유는 다음을 넣을 수 있기 때문입니다. '

'및' ' 내가 그 필터를 넣을 수만 있다면 , 그리고 아무것도, 내 사이트에 HTML을 제출하는 것이 환영하지 않는다는 것에 매우 동의함에 따라 기꺼이 그렇게 할 것입니다. 기사를 제출할 수있는 사람은 초대 전용 등록 절차로 제한되지만 그럼에도 불구하고 여전히 기회가 주어지면 해결할 수있는 내용이 있음을 언급해야합니다. – muttley91

답변

2

사용하고있는 기능은, nl2br 그들을 삽입하지만, 그들을 교체하지에 사용됩니다.\n<br />으로 바꾸려면 str_replace을 사용해야합니다. 좋아요 :

$string = str_replace("\n","<br />",$string); 

이 상황에서는 정규식이 필요하지 않습니다.

+0

그건 간단합니다.'nl2br', 그는 다른 방법을 원합니다 ('br => \ n'). –

+0

''nl2br()'은 실제로 "대체"하지 않고 모든 줄 바꿈 앞에'
'을 추가합니다. 그래서 줄 바꿈이 여전히 존재하는 이유를 설명합니다. 그래서 str_replace가 실제로 그들을 대체 할 것으로 예상됩니다. 나는이 요소들을 넣을 유일한 사람이다. 왜 처음에는 이런 식으로하지 않았는지 모르겠다. – muttley91

+1

또한 나는 보통 다음과 같은 것을 사용한다 :'$ string = str_replace (array ("\ r \ n", "\ r", "\ n"), "
", $ string);'일반적으로 사용되는 모든 CRLF 조합을 포함합니다. – Navarr

1

이 그것을 수정해야합니다 : 그들은 같은 줄에 수 있기 때문에

preg_replace('/<br(\s+)?\/?>(?!\s*\n)/i', "\n", mysql_result($result,$i,"content")) 

당신은 단순히 휴식을 제거 할 수 없습니다. 이 정규식은 모든 줄 바꿈을 줄 바꿈으로 대체하지만 줄 바꿈이 뒤 따르는 줄 바꿈은 대체하지 않습니다.

텍스트에 <br>\n을 남깁니다. 추가 정규식은 그들을 제거합니다 : 그것은 당신이 설명하는 문제처럼 보인다

preg_replace('/<br(\s+)?\/?>/i', "", $res) 
2

버그,하지만 bl2br의 기능이 아닙니다. http://php.net/manual/de/function.nl2br.php :

<?php 
function NlToBr($inString) 
{ 
    return preg_replace("%\n%", "<br>", $inString); 
} 
?> 

내가 PHP 매뉴얼에서 nl2br 기능의 문서의 의견이 하나를 발견 : 당신처럼, 그것을 위해 자신의 기능을 쓸 수 있습니다. 내가 올린 글이 당신을 위해 작동하지 않는다면, 그것이 어디에서 왔는지 더 많이 있어야합니다.

(또는, 나도 그 일을해야 추측 만 게시 한 다른 답변에서 함수를 사용)