【问题标题】:Reliably Remove Newlines From String可靠地从字符串中删除换行符
【发布时间】:2010-02-16 16:37:09
【问题描述】:

字符串输入来自文本区域,用户应该在其中输入新行中的每一项。

在处理表单时,很容易将 textarea 输入分解为单个项目的数组,如下所示:

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

它工作正常,但我担心它在不同的系统中无法正常工作(我目前只能在 Windows 中测试)。我知道换行符在不同平台上表示为 \r\n 或只是 \r 。上面这行代码在 Linux、Solaris、BSD 或其他操作系统下是否也能正常工作?

【问题讨论】:

    标签: php


    【解决方案1】:

    您可以使用preg_split 来执行此操作。

    $arr = preg_split('/[\r\n]+/', $textareaInput);
    

    它根据\r\n 字符的任意组合拆分它。您还可以使用 \s 来包含任何空白字符。

    编辑
    我突然想到,虽然前面的代码工作正常,但它也删除了空行。如果你想保留空行,你可能想试试这个:

    $arr = preg_split('/(\r\n|[\r\n])/', $textareaInput);
    

    它基本上从查找 Windows 版本 \r\n 开始,如果失败,它会查找旧 Mac 版本 \r 或 Unix 版本 \n

    例如:

    <?php
    $text = "Windows\r\n\r\nMac\r\rUnix\n\nDone!";
    $arr = preg_split('/(\r\n|[\r\n])/', $text);
    print_r($arr);
    ?>
    

    打印:

    Array
    (
        [0] => Windows
        [1] => 
        [2] => Mac
        [3] => 
        [4] => Unix
        [5] => 
        [6] => Done!
    )
    

    【讨论】:

    • @迈克尔·布鲁克斯。它是一个正则表达式。 [\r\n] 表示 \r\n。它寻找这两个字符的任何组合......不,你不正确。事实上,我确实更喜欢在 Linux 上工作,而且我很清楚这些差异。
    【解决方案2】:

    '\r' 本身作为行终止符是一个不再真正使用的旧约定(自基于 Unix 的 OSX 以来没有)。

    您的explode 会没事的。对于 Windows 用户,只需将 trim 去掉每个结果元素中的“\r”即可。

    【讨论】:

      【解决方案3】:
      $arr = preg_split( "/[\n\r]+/", $textareaInput );
      

      【讨论】:

        【解决方案4】:

        你可以标准化输入:

        <?php
        
        $foo = strtr($foo, array(
            "\r\n" => "\n",
            "\r" => "\n",
            "\n" => "\n",
        ));
        
        ?>
        

        或者,您可以使用正则表达式进行爆炸:

        <?php
        
        $foo = preg_split ("/[\r\n]+/", $foo);
        
        ?>
        

        【讨论】:

          【解决方案5】:

          以下代码必须完成工作

          <?php
          $split = preg_split('/[\r\n]+/', $src);
          foreach ($split as $k=>$string) {
              $split[$k] = trim($string);
              if (empty($split[$k]))
              unset($split[$k]);
          }
          ksort($split);
          $join = implode('', $split);
          ?>
          

          获得完全剥离换行符的字符串。但是它不能与 JS 一起正常工作:(

          【讨论】:

            【解决方案6】:

            使用正则表达式的系统不可知技术涉及\R 转义序列。

            PHP Documentation on Escape Sequences

            真的就像调用preg_split('~\R~', $textareaInput)一样简单。

            \R - 换行符:匹配 \n、\r 和 \r\n

            如果你只是想在替换字符上爆炸的话,规范化输入是浪费时间和精力。

            如果您担心字符串中有多个连续的换行符,您可以在\R 之后添加+ 量词。

            如果要从结果数组中的字符串两侧修剪空白字符,可以使用~\s*\R\s*~

            【讨论】:

              猜你喜欢
              • 2011-10-13
              • 1970-01-01
              • 2012-10-29
              • 1970-01-01
              • 1970-01-01
              • 2012-06-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多