2013-11-22 95 views
1

考慮這個代碼(http://codepad.org/lJGcW7tU):PHP:當在換行符上爆炸時添加了字符?

$str = '1 
2 
3 
4 
5 
6'; 

var_dump(explode("\n", $str)); 

我所期望的輸出是這樣的:

array(6) { 
    [0]=> 
    string(1) "1" 
    [1]=> 
    string(1) "2" 
    [2]=> 
    string(1) "3" 
    [3]=> 
    string(1) "4" 
    [4]=> 
    string(1) "5" 
    [5]=> 
    string(1) "6" 
} 

但實際上,它是這樣的:

array(6) { 
    [0]=> 
    string(2) "1 
" 
    [1]=> 
    string(2) "2 
" 
    [2]=> 
    string(2) "3 
" 
    [3]=> 
    string(2) "4 
" 
    [4]=> 
    string(2) "5 
" 
    [5]=> 
    string(1) "6" 
} 

explode似乎已經增加了一個除最後一個外,所有新數組元素均爲額外字符。這個字符不在原始字符串中,所以它來自哪裏?爲什麼?

+1

你的問題是不幸的是題外話了代碼審查。有關編碼時遇到的特定問題的問題,請嘗試[so]。在您的代碼正常工作後(您希望的方式),您可以編輯這個問題,尋求對您的工作代碼進行審查。 –

+0

那麼,我應該刪除它並將其放在堆棧溢出? – kasimir

+1

我希望主持人會爲你遷移它。所以現在不要擔心。請嘗試下面我建議的可能解決方案,看看它們是否適合你。 –

回答

3

換行符是represented differently among different platforms。在Unix系統中,它只是"\n",而在基於Windows的系統上則是"\r\n"

您的字符串可能包含"1\r\n2\r\n3\r\n(...)"這意味着當你在"\n"拆分它的結果的第一個指標是"1\r",第二個是"2\r"等等...

不同的解決方案:

  1. 將您的字符串初始化爲$str = "1\n2\n3\n4\n5\n6";
  2. 在使用基於Unix的換行符的文本編輯器中編寫您的PHP文件(一些更高級的文本編輯器有設置使用哪種類型的換行符)
  3. 各執"\r\n",而不是僅僅"\n"
+0

這可能是對的。拆分'\ r \ n'可以正常工作。我已經通過修改結果來解決它:'array_map('trim',explode(「\ n」,$ str))''但是我仍然對'\ r \ n'中斷來自哪裏感到困惑。腳本(我的真實腳本)在Unix機器上運行,字符串來自MySQL數據庫,通過我的Mac上的瀏覽器進行交互(因此也沒有Windows機器)。難道這一切都不是'\ n'休息嗎? – kasimir

+0

@ kasimir這取決於字符串是如何插入數據庫的。如果可能,請檢查數據庫中字節的實際字符串字節。如果存儲在數據庫中的字符串可以同時包含'\ r \ n'換行符*和*'\ n'換行符,那麼修剪字符串是個好主意。 –

+2

如果你需要保留空白,你可以使用['preg_split()'](http://www.php.net/manual/en/function.preg-split.php)在任一行分割結尾:'' preg_split(「/ \ r?\ n /」,$ str)'。 –