【问题标题】:Replace multiple newlines, tabs, and spaces [duplicate]替换多个换行符、制表符和空格
【发布时间】:2011-09-15 16:14:54
【问题描述】:

我想用一个换行符替换多个换行符,用一个空格替换多个空格。

我试过preg_replace("/\n\n+/", "\n", $text);但失败了!

我也在 $text 上完成这项工作以进行格式化。

$text = wordwrap($text, 120, '<br/>', true);
$text = nl2br($text);

$text 是取自 BLOG 用户的大文本,为了更好的格式,我使用了自动换行。

【问题讨论】:

  • 你失败了?什么地方出了错?你能粘贴一些代码吗?
  • 这两件事我都提到了
  • @hakre 我更新了我的代码
  • @Sourav - 目前尚不清楚您要达到的目标。从外观上看,博客文章是纯文本的,您希望在每 120 个单词后放置一个换行符(自动换行)并再次替换新行(nl2br)。您究竟想在什么时候用一个新行替换多个新行?
  • @Francois Deschenes 我想做 regex/preg 然后换行然后 nl2br !

标签: php regex preg-replace


【解决方案1】:

理论上,您的正则表达式确实有效,但问题是并非所有操作系统和浏览器都只在字符串末尾发送 \n。许多人还会发送一个\r。

试试:

我已经简化了这个:

preg_replace("/(\r?\n){2,}/", "\n\n", $text);

并且解决一些只发送\r的问题:

preg_replace("/[\r\n]{2,}/", "\n\n", $text);

根据您的更新:

// Replace multiple (one ore more) line breaks with a single one.
$text = preg_replace("/[\r\n]+/", "\n", $text);

$text = wordwrap($text,120, '<br/>', true);
$text = nl2br($text);

【讨论】:

  • 还有一些只发送\r ;) - 感谢您的澄清。
  • @Sourav - 在上面的示例中,您将 2 或更多 \n 替换为 2 \n 因此我的示例。如果您只想要 1(即跳过一行但中间不留空行),只需将 \n\n 替换为 \n。
  • 我还需要$text = preg_replace("/\s+/", ' ', $text);,谢谢 :)
  • 您可以进一步简化多行替换:preg_replace("/(\R){2,}/", "$1", $str);
  • 如果您正在格式化的文本在换行符之前、之后或之间有空格,这会清除它们:$text = preg_replace("/(\s*[\r\n]\s*)+/", "\n", $text);
【解决方案2】:

使用\R(代表任何行结束序列):

$str = preg_replace('#\R+#', '</p><p>', $str);

在这里找到:Replacing two new lines with paragraph tags

关于Escape sequences的PHP文档:

\R(换行:匹配\n、\r和\r\n)

【讨论】:

  • 这行得通,与公认的答案相比,这似乎是一个更清洁的解决方案。谢谢!
  • vraiment magnifique
【解决方案3】:

据我了解,这就是答案:

// Normalize newlines
preg_replace('/(\r\n|\r|\n)+/', "\n", $text);
// Replace whitespace characters with a single space
preg_replace('/\s+/', ' ', $text);

这是我用来将新行转换为 HTML 换行符和段落元素的实际函数:

/**
 *
 * @param string $string
 * @return string
 */
function nl2html($text)
{
    return '<p>' . preg_replace(array('/(\r\n\r\n|\r\r|\n\n)(\s+)?/', '/\r\n|\r|\n/'),
            array('</p><p>', '<br/>'), $text) . '</p>';
}

【讨论】:

  • 你说得对,但代码没有正确执行 [WinXP, FF]
  • 您遇到错误了吗?有什么错误?我在我的应用中使用了类似的替换。
  • 由于某种原因(W7 OS)这不起作用......虽然我认为它应该!我也尝试使用方括号...仍然无法工作...嗯,显然 preg_replace 有一些我不明白的东西...想知道您使用的是什么操作系统...
  • 服务器是Linux。在 Windows 上,它可能会将 "\n" 转换为回车和换行。
【解决方案4】:

你需要多行修饰符来匹配多行:

preg_replace("/PATTERN/m", "REPLACE", $text);

此外,在您的示例中,您似乎正用 2 个换行符替换 2+ 个换行符,这不是您的问题所表明的。

【讨论】:

  • 忽略我的 preg_replace,我知道那是错误的。
  • 我认为多行修饰符使 ^$ 捕获一行的开头和结尾,而不是 \n 匹配 \n
  • @hakre - 你是绝对正确的。在这种情况下,m 修饰符不是必需的。
  • @Chris - + 表示 1 或更多,所以理论上,@Sourav 可以替换许多额外的 \n。我认为这里使用 + 号没有任何问题。
  • @Francois:是的......我知道......这就是为什么我说“2+”换行符 - 就像在 2 或更多。 @hakre:好点,我没有意识到这只对带有锚的正则表达式有用。
【解决方案5】:

我尝试了以上所有方法,但对我不起作用。然后我创造了一些很长的方法来解决这个问题......

之前:

echo nl2br($text);

之后:

$tempData = nl2br($text);
$tempData = explode("<br />",$tempData);

foreach ($tempData as $val) {
   if(trim($val) != '')
   {
      echo $val."<br />";
   }
}

它对我有用。我写在这里是因为,如果有人来这里寻找像我这样的答案。

【讨论】:

    【解决方案6】:

    我会建议这样的事情:

    preg_replace("/(\R){2,}/", "$1", $str);
    

    这将处理所有 Unicode 换行符。

    【讨论】:

    • @Sourav:我认为您应该先致电preg_replace("/(\r\n|\n|\r){2,}/", "$1", $text);,然后再致电nl2br
    • 我在 nl2br 之前调用 preg_replace 并换行!
    • 那很好,那么请告诉我您在使用preg_replace("/(\r\n|\n|\r){2,}/", "$1", $text);时遇到了什么问题
    • 我应该只为任意数量的 br 获得一个 br,但我最多只能获得 3 个 br
    • 您可以将其简化为:preg_replace("/(\R){2,}/", "$1", $str);
    【解决方案7】:

    如果你只想用一个标签替换多个标签,使用下面的代码。

    preg_replace("/\s{2,}/", "\t", $string);
    

    【讨论】:

      【解决方案8】:

      试试这个:

      preg_replace("/[\r\n]*/", "\r\n", $text); 
      

      【讨论】:

      • 我对执行此操作时会发生什么感兴趣。
      • 因为您匹配的字符串包含换行符,您可能需要使用m 模式修饰符。请参阅php.net/reference.pcre.pattern.modifiers 了解更多信息。
      【解决方案9】:

      替换字符串或文档的开头和结尾!

      preg_replace('/(^[^a-zA-Z]+)|([^a-zA-Z]+$)/','',$match);
      

      【讨论】:

        【解决方案10】:

        我在 PHP 中处理了 strip_tags 函数并且遇到了一些问题,例如:在换行之后出现一个带有一些空格的新行,然后连续出现一个新的换行......等等。没有任何规则:(。

        这是我处理 strip_tags 的解决方案

        将多个空格替换为一个,多个换行符替换为单个换行符

        function cleanHtml($html)
        {
            // Clean code into script tags
            $html = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $html);
        
            // Clean code into style tags
            $html = preg_replace('/<\s*style.+?<\s*\/\s*style.*?>/si', '', $html );
        
            // Strip HTML
            $string = trim(strip_tags($html));
        
            // Replace multiple spaces on each line (keep linebreaks) with single space
            $string = preg_replace("/[[:blank:]]+/", " ", $string); // (*)
        
            // Replace multiple spaces of all positions (deal with linebreaks) with single linebreak
            $string = preg_replace('/\s{2,}/', "\n", $string); // (**)
            return $string;
        }
        

        关键字是 (*) 和 (**)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-18
          • 1970-01-01
          • 2012-06-04
          • 2013-08-10
          • 2021-08-24
          • 2020-03-11
          • 1970-01-01
          相关资源
          最近更新 更多