2011-04-24 84 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); 

这将只匹配“经典”换行序列。