【问题标题】:How to remove line breaks (no characters!) from the string?如何从字符串中删除换行符(无字符!)?
【发布时间】:2012-06-01 05:28:50
【问题描述】:

这似乎是一个骗局,但请放心,它不是 - 我已经搜索了 SO 以及网络的其他部分以寻找我的问题的答案,最终发现同样不足的“解决方案”超过。总之,就是这样:

我正在将用户输入从 textarea 保存到 MySQL 数据库(在 WordPress 环境中,但我相信这与这个问题无关)。它稍后会从数据库中检索,以显示给站点后端的管理员。当用户提交带有换行符的文本(即按 Enter 键)时会出现此问题。

示例字符串可能如下所示:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!

Greetings,
Bill

字符串中没有行尾字符(“\n”、“\r”等)。

我在它上面使用nl2br() 来生成HTML 输出,但这还不够。结果是:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill

据我了解,这是预期的nl2br() 结果,因为它插入了标签并且不应该首先替换换行符?

但是我需要的格式是这样的:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br /><br />Greetings,<br />Bill

如果字符串中包含 EOL 字符,例如“\n”,我会用 str_replace()preg_replace() 打它并完成它,但我不知道用什么针喂其中任何一个如果一开始就没有字符,则函数。

我可以手动访问数据库中的相关字段,为每个换行符点击 Backspace,然后我想要对字符串执行的操作。所以我知道我需要上述格式。

【问题讨论】:

  • 如果字符串看起来像你的第一个例子,那么你怎么能说它没有换行符呢?它至少有两个:在“谢谢!”之后连续两个
  • Fair enuff @ErnestFriedman-Hill,你显然是对的 - 那里有“东西”,它既不可见也不知道。
  • 我也看不出没有换行符怎么可能有新行。你能用十六进制编辑器检查字符串吗?我相信你会找到新行的字符...

标签: php html replace line-breaks nl2br


【解决方案1】:

Ben's solution 可以接受,但str_replace()preg_replace() 快得多

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

使用更少的 CPU 功率,减少全球二氧化碳排放量。

【讨论】:

  • 不敢相信这个答案没有得到更多的信任。 preg_replace() 对此有 100 个赞
  • 重要提示:在回车和换行代码周围使用双引号。如果您使用单引号,这些将无法正确处理!
  • 点赞 -> “使用更少的 CPU 资源,减少全球二氧化碳排放量。”
  • @Joeri:最后一个永远不会被调用,因为它将由前两个处理。这是多余的代码。
  • @Joeri 考虑到 str_replace 删除 所有 次出现,\r 和 \n 都不会被删除吗?
【解决方案2】:

您应该能够将其替换为删除所有换行符和回车符的 preg。代码是:

preg_replace( "/\r|\n/", "", $yourString );

即使\n 字符没有出现,如果你得到回车,那里有一个不可见的字符。 preg 替换应该抓住并修复这些。

【讨论】:

  • 难以置信。我本可以发誓按照您的思路和@bsdnoobz 的答案尝试了所有方法,它们都可以完成工作。哦,好吧,无论我有什么心理障碍,你们俩都为我节省了大量时间。原来是一个相当愚蠢的问题,我猜。谢谢大家!
  • 请注意,这不会匹配所有换行符,即在 Windows 系统上创建的换行符。要捕获这些,您可以使用以下 RegEx 代替 /\r|\n|\r\n/
  • 使用\R(代表任何行结束序列)stackoverflow.com/a/16274784/1491212
【解决方案3】:
$str = "
Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill";

echo str_replace(array("\n", "\r"), '', $str);  // echo $str in a single line

【讨论】:

    【解决方案4】:

    这是因为nl2br() 根本不删除新行。

    返回带有&lt;br /&gt;&lt;br&gt;的字符串插入所有换行符(\r\n\n\r\n\r)。

    改用str_replace

    $string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
    

    【讨论】:

      【解决方案5】:

      str_replace(PHP_EOL, null, $str);

      【讨论】:

      • 虽然这可能会回答问题。建议对您的答案进行一些解释。
      • PHP_EOL 在读取字符串时并不总是有效。当你写它们时它会发生。
      • 纯代码答案在 StackOverflow 上的价值很低,因为它们对 OP 和未来读者的教育作用很小。
      • 警告:这是一个不可靠的答案。 PHP_EOL 在不同系统上的定义不同。有时是换行,有时是回车后跟换行。因此,在某些情况下这将失败,可能会创建攻击向量(例如,在创建电子邮件标头时)。 PHP_EOL 只能用于输出信息,不能用于破译输入不要使用
      【解决方案6】:

      你也可以使用PHP trim

      这个函数返回一个字符串,从 str 的开头和结尾去掉空格。如果没有第二个参数,trim() 将去除这些字符:

      • " " (ASCII 32 (0x20)),一个普通的空格。
      • “\t”(ASCII 9 (0x09)),一个制表符。
      • “\n”(ASCII 10 (0x0A)),换行(换行)。
      • “\r”(ASCII 13 (0x0D)),回车。
      • “\0”(ASCII 0 (0x00)),NUL 字节。
      • “\x0B”(ASCII 11 (0x0B)),垂直制表符。

      【讨论】:

      • 这只会针对字符串开头和结尾处的换行符。字符串中间的换行符将保持不变。
      【解决方案7】:

      为了在 Windows 上也能正常工作,我建议使用

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

      "\r\n" - 适用于 Windows,"\r" - 适用于 Mac 和 "\n" - 适用于 Linux

      【讨论】:

      • 对不起,伙计,但即使是在 12 年问过的人,我也可以绝对肯定地告诉你,这是多余的。问问自己以下问题:如果字符串中的所有\r\n 都被删除了,那么直接相互跟随的那些为什么不是这种情况?
      • 真的,这个显而易见的事情并没有出现在我的脑海中......谢谢 :) 我刚刚意识到我遇到了麻烦,但反过来,我使用了\r\n Windows,它在 Linux 上不起作用。
      • 嗯,我正在使用这个函数用逗号替换换行符,所以地址是单行文本,所以替换 \r\n FIRST 会有所帮助,因为这意味着每个部分一个逗号而不是两个如果该换行符
      • @Martin 是的,你是对的,我刚刚意识到相同,所以我们先替换 \r\n,然后我们替换 \r\n,我已经编辑了我的答案。跨度>
      • 这仍然是多余的,如果你要删除所有\r\r,则不需要删除\r\n,你可以使用str_replace(array("\r","\n"), "", $buffer);得到相同的结果。
      【解决方案8】:

      更实用的东西(在任何地方都易于使用):

      function strip_carriage_returns($string)
      {
          return str_replace(array("\n\r", "\n", "\r"), '', $string);
      }
      

      使用 PHP_EOL 作为搜索替换参数也是一个好主意!赞一个。

      【讨论】:

        【解决方案9】:

        我认为我的回答为时已晚,但我在 JS 脚本中使用它时遇到了同样的额外行问题,但它的工作原理是这样的

        这将在字符串中添加&lt;br /&gt; 和换行符。

        $text = nl2br($text);
        

        此行将删除多余的行。

        $text = preg_replace("/\r|\n/", "", $text);
        

        在插入数据库时​​将&lt;br /&gt; 替换为任何不需要的常用符号,如星号**

        $text = str_replace("<br />","**",$text );
        

        当我想在程序中使用它时,我用它代替**

        $text = str_replace("**","\\n",$text );
        

        然后在程序中使用$text

        【讨论】:

          【解决方案10】:

          替代内置:trim()

          trim — Strip whitespace (or other characters) from the beginning and end of a string
          Description ¶
          trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] ) : string
          
          This function returns a string with whitespace stripped from the beginning and end of str.
          Without the second parameter, trim() will strip these characters:
          
              " " (ASCII 32 (0x20)), an ordinary space.
              "\t" (ASCII 9 (0x09)), a tab.
              "\n" (ASCII 10 (0x0A)), a new line (line feed).
              "\r" (ASCII 13 (0x0D)), a carriage return.
              "\0" (ASCII 0 (0x00)), the NUL-byte.
              "\x0B" (ASCII 11 (0x0B)), a vertical tab.
          

          它可以从不同类型的文本文件中删除换行符,但不处理 html。

          【讨论】:

            【解决方案11】:

            我使用 3 行代码来完成这项工作,因此请将 $s 视为您的“材料”...

            $s=str_replace(chr(10),'',$s);
            $s=str_replace(chr(13),'',$s);
            $s=str_replace("\r\n"),'',$s);
            
            • 传说:

            chr(10)___换行

            chr(13)___回归

            \r\n______换行

            【讨论】:

              【解决方案12】:

              您可以使用 preg_replace 来替换与正则表达式匹配的部分字符串,例如:

              preg_replace("/\s+/","",$string);
              

              【讨论】:

              • 这将替换/删除所有空白字符,包括制表符空格。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-10-13
              • 1970-01-01
              • 2016-04-14
              • 1970-01-01
              • 2014-05-12
              • 2012-06-04
              相关资源
              最近更新 更多