【问题标题】:Remove new lines from string and replace with one empty space从字符串中删除新行并替换为一个空格
【发布时间】:2011-04-15 05:16:09
【问题描述】:
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

想要从字符串中删除所有新行。

我有这个正则表达式,它可以捕获所有这些,问题是我不知道我应该使用哪个函数。

/\r\n|\r|\n/

$string 应该变成:

$string = "put returns between paragraphs for linebreak add 2 spaces at end ";

【问题讨论】:

  • 如果您要进行数千次替换,请避免使用preg_replace。它的速度几乎是str_replace 的两倍。
  • 您可能会发现s($str)->normalizeLineEndings('') 很有帮助,如this standalone library 中所示。它不仅会删除 LF、CR 和 CRLF,还会删除任何 Unicode 换行符。

标签: php regex string


【解决方案1】:

只需使用preg_replace()

$string = preg_replace('~[\r\n]+~', '', $string);

你可以在这个上使用str_replace(),尽管代码看起来不那么干净:

$string = str_replace(array("\n", "\r"), '', $string);

ideone观看直播

【讨论】:

  • OP 想要在“paragraphs”和“for”之间有一个空格。如果您只是删除换行符,则不会有一个。
  • 请将其更正为$string = preg_replace("~[\r\n]~", "",$string);
  • 否则无话可说。我认为这是最简单的答案!
  • @erik 然后我会“纠正”它。它可以正常工作。
  • @Vineet 这只是一个分隔符,表示正则表达式的开始和结束
【解决方案2】:

你必须小心双换行符,这会导致双空格。使用这个非常有效的正则表达式:

$string = trim(preg_replace('/\s\s+/', ' ', $string));

多个空格和换行符被一个空格替换。

编辑:正如其他人指出的那样,此解决方案存在匹配单词之间的单个换行符的问题。这在示例中没有出现,但可以很容易地看到这种情况是如何发生的。另一种方法是执行以下操作:

$string = trim(preg_replace('/\s+/', ' ', $string));

【讨论】:

  • 在您使用此解决方案之前,请参阅下面的我的答案以及我的答案的 cmets。此解决方案可能无法按您的预期工作。
  • 在正则表达式“\s 匹配空白字符”中,为什么会匹配换行符?
  • 我正在寻找一种解决方案来删除/替换所有空格但不是(双)空格。这是执行此操作的正则表达式:/(?![ ])\s+/
  • 只是想让您知道您的解决方案为我节省了很多时间。
  • 错了。 \s 匹配任何空格,包括空格、制表符、换行符、回车符。我不知道这是怎么得到这么多赞成票的。要匹配换行符,您需要 \r?\n 这是一个可选的换行符,前面有一个回车符。
【解决方案3】:
$string = str_replace(array("\n", "\r"), ' ', $string);

【讨论】:

  • PHP中的转义序列需要双引号。
  • 这并不完全符合 OP 的要求,因为这与 elusive 的答案相同,并且不会删除 \r 字符
  • @NullUser:你为什么不更新自己的帖子而不是对此发表评论?
  • @NullUser:除了它用 '' 而不是 ' ' 替换所有内容。
【解决方案4】:

PCRE 正则表达式替换可以使用 preg_replace 完成: http://php.net/manual/en/function.preg-replace.php

$new_string = preg_replace("/\r\n|\r|\n/", ' ', $old_string);

会用空格替换换行符或返回字符。如果您不想替换它们,请将第二个参数更改为 ''

【讨论】:

  • preg 函数使用 PCRE,而不是 POSIX,正则表达式。有使用 POSIX 的 ereg 函数,但现在已弃用。
【解决方案5】:

使用这个:

用空字符串替换一系列换行符:

$string = preg_replace("/[\\n\\r]+/", "", $string);

或者您可能想用一个空格替换换行符:

$string = preg_replace("/[\\n\\r]+/", " ", $string);

【讨论】:

  • 请正确格式化您的代码。这是通过将相关行缩进四个空格来完成的。
  • 这就是我使用单引号的原因,所以我不需要转义这些字符。 \\n 看起来很糟糕。 \\\\ 匹配单个反斜杠太糟糕了。
【解决方案6】:

您应该使用 str_replace 来提高速度,并在数组中使用双引号

str_replace(array("\r\n","\r"),"",$string);

【讨论】:

  • 资源少,完美,tks。
  • 我可能错了,但这段代码不会删除 Unix 系统上的换行符,因为在这些系统上,换行符只是 \n 而不是 \r\n 而且我认为 OP 要求放一个单个空格代替新行
  • @MarcoDemaio,只需将"\n", "\n\r" 添加到数组中。
【解决方案7】:

这是我会使用的模式

$string = preg_replace('@[\s]{2,}@',' ',$string);

【讨论】:

    【解决方案8】:

    关于已接受答案的一些问题:

    + 表示“1 个或多个”。我认为您无需重复\s。我想你可以简单地写'/\s+/'

    另外,如果要删除字符串中的第一个和最后一个空格,请添加trim

    通过这些修改,代码将是:

    $string = preg_replace('/\s+/', ' ', trim($string));
    

    【讨论】:

    • 你是对的; /\s\s+/ 将无法匹配 foo\nbar 中的换行符。
    【解决方案9】:

    Escape sequence \R 匹配通用换行符

    也就是说,任何被 Unicode 视为换行序列的东西。这包括与\v 匹配的所有字符(垂直空格),以及多字符序列\x0D\x0A...

    $string = preg_replace('/\R+/', " ", $string);
    

    在 8 位非 UTF-8 模式下,\R 等价于:(?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

    Regex101 Demo

    【讨论】:

    • Anton 请检查我的编辑是否正常!添加了一些进一步的信息。
    【解决方案10】:

    这个也删除了标签

    $string = preg_replace('~[\r\n\t]+~', '', $text);
    

    【讨论】:

      【解决方案11】:

      我不确定这对已经提交的答案是否有任何价值,但我也可以发布它。

      // Create an array with the values you want to replace
      $searches = array("\r", "\n", "\r\n");
      
      // Replace the line breaks with a space
      $string = str_replace($searches, " ", $string);
      
      // Replace multiple spaces with one
      $output = preg_replace('!\s+!', ' ', $string);
      

      【讨论】:

        【解决方案12】:

        关于:

        $string = trim( str_replace( PHP_EOL, ' ', $string ) );
        

        这应该是一个非常强大的解决方案,因为如果我没记错的话,\n 并不是在所有系统中都能正常工作...

        【讨论】:

        • 这似乎没有取代 \r 而只是 \n:ideone.com/28KPcb
        • 如手册中所述,PHP_EOL 包含当前平台的正确“行尾”符号。如果您从其他平台导入字符串,或者您的字符串格式不正确,这可能会中断。
        • 如果你有一个非常封闭的环境,这对我来说似乎是最优雅的解决方案,因为它独立于平台并且可能非常高效......如果你有更广泛的输入,比如导入/导出场景,你可能应该使用正则表达式解决方案。
        【解决方案13】:

        您可以尝试下面的代码将保留文本中的所有空格和新行。

        $str = "
        put returns between paragraphs
        
        for linebreak add 2 spaces at end
        
        ";
        
        echo preg_replace( "/\r|\n/", "", $str );
        

        【讨论】:

          【解决方案14】:

          看到大家对正则表达式知之甚少,我感到很惊讶。

          php 中的换行符是

          $str = preg_replace('/\r?\n$/', ' ', $str);
          

          在 perl 中

          $str =~ s/\r?\n$/ /g;
          

          意思是用空格替换行尾的任何换行符(为了提高效率) - 可选地以回车开头 - 用空格。

          \n 或 \015 是换行符。 \r 或 \012 是回车。 ?在正则表达式中表示匹配前一个字符的 1 或 0。 正则表达式中的 $ 表示匹配行尾。

          原始和最佳的正则表达式参考是 perldoc perlre,每个编码人员都应该非常了解这个文档: http://perldoc.perl.org/perlre.html 请注意,并非所有语言都支持所有功能。

          【讨论】:

          • 这个解决方案对我不起作用,但如前所述,我需要阅读更多内容才能产生实际的解决方案。我很惊讶这不起作用。
          • @AdamWhateverson 不,上面是对的。也许你的字符串有文字反斜杠 n 而不是换行符?此外,在某些语言中,您可能需要添加 m(多行)修饰符。
          【解决方案15】:

          也许这行得通:

          $str='\n';
          echo str_replace('\n','',$str);
          

          【讨论】:

            【解决方案16】:

            以下代码适用于所有文本,请使用它:

            $des = str_replace('\n',' ',$des);
            $des = str_replace('\r',' ',$des);
            

            【讨论】:

              【解决方案17】:

              文本中的换行符一般表示为:

              \r\n - 在 Windows 计算机上

              \r - 在 Apple 电脑上

              \n - 在 Linux 上

              //Removes all 3 types of line breaks
              
              $string = str_replace("\r", "", $string);
              
              $string = str_replace("\n", "", $string);
              

              【讨论】:

                【解决方案18】:

                其中许多解决方案对我不起作用。 但这确实成功了:-

                $svgxml = preg_replace("/(*BSR_ANYCRLF)\R/",'',$svgxml);
                

                这是参考:- PCRE and New Lines

                【讨论】:

                • 终于经过1天的搜索!!真的非常感谢?
                【解决方案19】:

                您可以删除新行和多个空格。

                $pattern = '~[\r\n\s?]+~';
                $name="test1 /
                                     test1";
                $name = preg_replace( $pattern, "$1 $2",$name);
                
                echo $name;
                

                【讨论】:

                  【解决方案20】:

                  使用上述解决方案的组合,这一行对我有用

                   $string = trim(str_replace('\n', '', (str_replace('\r', '', $string))));
                  

                  它删除了 '\r' 和 '\n'。

                  【讨论】:

                    【解决方案21】:

                    很简单

                    $hello = "
                    A
                    B
                    C
                    ";
                    str_replace("
                    ", " ", $hello);
                    // A B C
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2016-04-27
                      • 2011-08-17
                      • 2011-08-27
                      • 1970-01-01
                      • 2011-04-29
                      • 2013-03-07
                      • 1970-01-01
                      • 2018-07-02
                      相关资源
                      最近更新 更多