2011-04-24 37 views
4

我已經使用爆炸函數來獲取textarea的包含到基於行的數組中。當我在我的本地主機(WAMPserver 2.1)運行這段代碼符合本規則很好地工作:爆炸錯誤 r n和 n在Windows和Linux服務器

$arr=explode("\r\n",$getdata); 

當我上傳到我的Linux服務器,我需要每次更改上面的代碼爲:

$arr=explode("\n",$getdata); 

什麼將是我永久的解決方案。哪些常見的代碼適用於我的兩臺服務器?

謝謝

回答

6

恆定PHP_EOL包含依賴於平臺的換行,所以你可以試試這個:

$arr = explode(PHP_EOL, $getdata); 

但更好的是標準化的文本,因爲你永遠不知道什麼操作系統上的訪客使用。這是一種方式,以標準化爲僅可使用\ n作爲換行符(但也看到亞歷克斯的答案,因爲他正則表達式將處理所有類型的換行的):

$getdata = str_replace("\r\n", "\n", $getdata); 
$arr = explode("\n", $getdata); 
+0

雖然有些操作系統使用\ r作爲換行符,但您也需要處理。 – GordonM 2011-04-24 08:54:37

+0

GordonM,你是對的。十年前的Mac OS 9使用\ r(以及80年代的一些系統),但我認爲任何人都不會在舊軟件上運行Web服務器。 – 2011-04-24 09:00:13

+0

確實夠不錯,但它絕不會讓你的基地受到影響:) – GordonM 2011-04-24 09:01:11

0

的PHP_EOL常量包含主機操作系統的的字符序列新隊。

$arr=explode(PHP_EOL,$getdata); 
0

你可以使用preg_split()這將使不管它的工作:

$arr = preg_split('/\r?\n/', $getdata); 
1

好,最好的辦法是標準化輸入數據只使用\n,像這樣:

$input = preg_replace('~\r[\n]?~', "\n", $input); 

由於:

  • Unix使用\n
  • Windows使用\r\n
  • (舊)Mac OS使用\r

儘管如此,通過\n爆炸應該得到最好的結果(如果你不正常化)。

6

據我所知分裂由換行符的字符串的最佳方式是preg_split\R

preg_split('~\R~', $str); 

\R匹配任何Unicode行序列,即不僅LFCRCRLF,也更奇特諸如VT,FF,NEL,LSPS

如果不需要這種行爲(爲什麼?),你可以指定BSR_ANYCRLF選項:

preg_split('~(*BSR_ANYCRLF)\R~', $str); 

這將只匹配「經典」換行序列。