2012-02-26 32 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 />將被轉換回換行,並期待這樣的:

Hello, this is my article. 

I am demonstrating a new line here. 

因爲<br />轉化爲一個換行符,但已經有一個換行符。所以我想我希望是,它最初被轉換爲這樣的事:

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

我不知道......有沒有辦法從保持原有換行停止nl2br()功能?可能與Windows \r\n有關?

+2

您可能會遇到一些嚴重的頭痛,除非您的用戶都擅長HTML並且絕對值得信賴。因爲如果你允許人們將HTML上傳到你的網站上,而且大部分都是未經過濾的,那麼你正在引入一個巨大的XSS漏洞,可能還有一些社會工程入口點。 – tdammers 2012-02-26 16:22:32

+2

爲什麼在第一次提交文章時需要將新行轉換爲
?您可以在顯示文章時對文章進行格式設置。 – 2012-02-26 16:27:54

+0

@tdammers我目前沒有過濾它的唯一原因是因爲我想讓他們把以下內容: '

'和'' 如果我只能讓他們把這些,沒有別的,我會很樂意這樣做,因爲我非常贊同將HTML提交給我的網站不受歡迎。 我應該提到,那些可以提交文章的人受到僅限邀請的註冊流程的限制,但仍然有機會,我仍然會修復這些內容。 – muttley91 2012-02-26 17:20:54

回答

2

您正在使用的功能,nl2br用於插入他們,而不是取代他們。如果您想用<br />替換\n,則只需使用str_replace即可。像這樣:

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

這種情況絕對不需要正則表達式。

+0

這很簡單,'nl2br',他想要另一種方式('br> \ n')。 – 2012-02-26 16:35:53

+0

在重讀函數描述時,'nl2br()'實際上並不是「替換」,它只是在所有換行符前面加上'
',這就解釋了爲什麼換行符仍然存在,所以我期望str_replace將實際替換它們。我是唯一一個將這些元素放入其中的人,我不確定爲什麼我沒有這樣做。 – muttley91 2012-02-26 17:10:17

+1

此外,我通常使用類似於:'$ string = str_replace(array( 「\ r \ n」,「\ r」,「\ n」),「
」,$ string);'覆蓋所有常用的CRLF組合。 – Navarr 2012-02-26 19:45:32

1

這應該修復它:

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

你不能簡單地刪除休息,因爲他們可能是在同一條線上。這個正則表達式會用換行符替換所有的換行符,但不會換行符換行符。

它會在文本中留下<br>\n。額外的正則表達式將擺脫他們:

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

看來你所描述的問題不是一個錯誤,而是一個bl2br的功能。你可以只寫自己的函數吧,如:

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

我發現這個人在PHP手冊中的nl2br功能的文檔的評論:http://php.net/manual/de/function.nl2br.php。如果我發佈的那個不適合你,那麼它應該有更多來自哪裏。

(或者只是使用從剛發佈的其他答案的功能,我想這應該工作,太)