【问题标题】:explode error \r\n and \n in windows and linux serverwindows和linux服务器中的爆炸错误\r\n和\n
【发布时间】:2011-08-11 19:01:52
【问题描述】:

我使用了explode 函数将textarea 的contain 放入基于行的数组中。当我在本地主机(WAMPserver 2.1)中运行此代码时,它与此代码完美配合:

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

当我上传到我的 linux 服务器时,我需要每次将上面的代码更改为:

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

什么将是我的永久解决方案。哪个通用代码适用于我的两个服务器?

谢谢

【问题讨论】:

    标签: php textarea explode


    【解决方案1】:

    常量 PHP_EOL 包含依赖于平台的换行符,所以你可以试试这个:

    $arr = explode(PHP_EOL, $getdata);
    

    但更好的是规范化文本,因为您永远不知道访问者使用什么操作系统。这是规范化仅使用 \n 作为换行符的一种方法(但也请参阅 Alex 的回答,因为他的正则表达式将处理所有类型的换行符):

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

    【讨论】:

    • 一些操作系统使用 \r 作为换行符,你也需要处理它。
    • GordonM,你是对的。十年前的 Mac OS 9 使用 \r(以及 80 年代的一些系统),但我认为没有人在那个旧软件上运行 Web 服务器。
    • 确实如此,但保护你的基地永远不会受到伤害:)
    • PHP_EOL 常量是相对于服务器环境的,输入数据可能有其他来源。
    • Alix,没错,这就是为什么最好对输入进行标准化。您的正则表达式可能是最好的解决方案(我也在澄清我的答案,但不会窃取您的名声:-))。
    【解决方案2】:

    据我所知,用换行符分割字符串的最佳方法是 preg_split\R

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

    \R 匹配任何 Unicode 换行序列,即不仅是 LFCRCRLF,而且还包括更奇特的诸如 VTFFNELLS 和 @ 987654334@.

    如果不需要这种行为(为什么?),您可以指定 BSR_ANYCRLF 选项:

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

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

    【讨论】:

      【解决方案3】:

      嗯,最好的方法是将您的输入数据标准化为只使用\n,如下所示:

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

      自:

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

      尽管如此,\n 的爆炸应该会给你带来最好的结果(如果你不规范化的话)。

      【讨论】:

        【解决方案4】:

        PHP_EOL 常量包含主机操作系统换行符的字符序列。

        $arr=explode(PHP_EOL,$getdata);
        

        【讨论】:

          【解决方案5】:

          您可以使用preg_split(),这将使它无论如何都可以工作:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-04
            • 1970-01-01
            • 2013-12-20
            • 1970-01-01
            • 2015-03-29
            • 1970-01-01
            相关资源
            最近更新 更多