2012-10-31 392 views
6

我有一個textarea正在正常工作的網站上提交給我的數據庫。但是當我從我的數據庫生成CSV(通過PHP)時,所有換行符都會與生成的CSV混淆。任何CSV閱讀器都會將輸入中的換行符解釋爲新行。如何去除所有換行符以生成正確的CSV?

我曾嘗試以下方法:

  1. 封裝在引號中的字段。

  2. 此:

    $field = str_replace(array('\n', '\r', '\r\n', '\n\r'), ',', $original_field); 
    
  3. 而且這樣的:

    $field = strip_tags(nl2br($original_field)); 
    
  4. 結合上述所有的方法。

無論如何,最終的結果仍然是一個亂七八糟的CSV,它會破壞用戶輸入的任何換行符。我設法阻止了文本區域的換行符,但還有很多傳統提交需要我在CSV端修復此問題。

爲什麼它不起作用?我該如何解決這個問題?

+0

你是如何建立CSV? –

+0

您的數據庫項目是否已使用CSV格式? –

+0

不,我是通過fwrite生成的。但在閱讀答覆後,我可能會重新思考並通過putcsv生成。 –

回答

10

之前接受(用戶user1517891)的答案是不正確的,它會在字符串替換兩次,當有\r\n ...這將取代它成爲兩個逗號,。首先它將取代\r =>,,然後\n =>,

您需要在不同的順序來使用它,因爲:

$field = str_replace(array("\r\n", "\n\r", "\n", "\r"), ',', $original_field); 
2

你必須把\n和類似的標籤在雙引號,否則他們將被視爲簡單的字符串,而不是作爲換行符。

7

使用雙引號:

$field = str_replace(array("\n", "\r", "\r\n", "\n\r"), ',', $original_field); 
+2

這是不正確的。 – Legionar

1

如果使用fputcsv()這個問題甚至不應該存在:

fputcsv($f, array($field1, $field2, $field3)); 

默認情況下它使用逗號作爲分隔符和雙引號作爲字符串外殼。

+0

我也這麼認爲,但他沒有詳細說明輸出;他稱之爲CSV,但我們不知道如何從輸入中處理它。考慮到他在代碼中使用替換字符串時的逗號,似乎用戶輸入本身可能已經是CSV格式的行了?這意味着'fputcsv()'不是解決他眼前的問題的方法。在各行之間進行閱讀,似乎他的代碼似乎可以通過使用'fputcsv()'來簡化,但這對他現在的做法可能是一個重大的改變。 – SDC

2

我建議使用preg_replace()這不是str_replace()。原因是可能有多個換行符和\r\n的組合,我希望您希望只用一個逗號替換它們。

我也建議使用trim()去除尾隨空行。

$field = preg_replace('/[\n\r]+/', ',', trim($original_field)); 
相關問題