替换多个换行符,制表符,空格

时间:2011-06-15 15:50:03

标签: php regex preg-replace

我想用一个换行符替换多个换行符,多个空格换一个空格 我试过preg_replace("/\n\n+/", "\n", $text);但失败了!

我也在$ text上进行格式化工作。

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

$ text是用户为BLOG拍摄的大文本,为了更好的格式化,我使用wordwrap。

10 个答案:

答案 0 :(得分:52)

理论上,你定期快递确实有效,但问题是并非所有操作系统和浏览器都只在字符串末尾发送\ n。许多人还会发送\ r。

尝试:

编辑:我简化了这个:

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

编辑:并解决了一些发送\ r \ n的问题:

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

更新1:根据您的更新:

// 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);

答案 1 :(得分:32)

  

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

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

在此处找到:http://forums.phpfreaks.com/topic/169162-solved-replacing-two-new-lines-with-paragraph-tags/

关于Escape sequences的PHP文档:

  

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

答案 2 :(得分:8)

这是答案,因为我理解这个问题:

// 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>';
}

答案 3 :(得分:2)

您需要多线修改器来匹配多条线:

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

同样在您的示例中,您似乎正在用2替换2个换行符,这不是您的问题所指示的。

答案 4 :(得分:1)

我会建议这样的事情:

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

这将处理所有Unicode换行符。

答案 5 :(得分:1)

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

之前:

echo nl2br($text);

之后:

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

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

这对我有用..我在这里写道是因为有人来这里找到像我这样的答案。

答案 6 :(得分:1)

如果您只想用一个标签替换多个标签,请使用以下代码。

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

答案 7 :(得分:0)

试试这个:

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

答案 8 :(得分:0)

替换字符串或文档的头部和末尾!

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

答案 9 :(得分:0)

我已经处理过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;
 }

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