如何从PHP中的文本中删除空行?

我需要在PHP中删除空白行(用空格或绝对空白)。 我使用这个正则expression式,但它不起作用:

$str = ereg_replace('^[ \t]*$\r?\n', '', $str); $str = preg_replace('^[ \t]*$\r?\n', '', $str); 

我想要的结果是:

 blahblah blahblah adsa sad asdasd 

将:

 blahblah blahblah adsa sad asdasd 
 // New line is required to split non-blank lines preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $string); 

上面的正则expression式说:

 /(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/ 1st Capturing group (^[\r\n]*|[\r\n]+) 1st Alternative: ^[\r\n]* ^ assert position at start of the string [\r\n]* match a single character present in the list below Quantifier: Between zero and unlimited times, as many times as possible, giving back as needed [greedy] \r matches a carriage return (ASCII 13) \n matches a fine-feed (newline) character (ASCII 10) 2nd Alternative: [\r\n]+ [\r\n]+ match a single character present in the list below Quantifier: Between one and unlimited times, as many times as possible, giving back as needed [greedy] \r matches a carriage return (ASCII 13) \n matches a fine-feed (newline) character (ASCII 10) [\s\t]* match a single character present in the list below Quantifier: Between zero and unlimited times, as many times as possible, giving back as needed [greedy] \s match any white space character [\r\n\t\f ] \tTab (ASCII 9) [\r\n]+ match a single character present in the list below Quantifier: Between one and unlimited times, as many times as possible, giving back as needed [greedy] \r matches a carriage return (ASCII 13) \n matches a fine-feed (newline) character (ASCII 10) 

您的ereg-replace()解决scheme是错误的,因为ereg/eregi方法已被弃用。 你的preg_replace()甚至不会编译,但是如果你添加分隔符并设置多行模式,它将正常工作:

 $str = preg_replace('/^[ \t]*[\r\n]+/m', '', $str); 

m修饰符允许^匹配逻辑行的开始,而不仅仅是整个string的开始。 起始行锚点是必要的,因为没有它,正则expression式将匹配每行结尾处的换行符,而不仅仅是空行。 您不需要行结束符( $ ),因为您主动匹配换行符,但不会造成伤害。

被接受的答案可以完成工作,但是它比需要的复杂得多。 正则expression式必须匹配string的开头( ^[\r\n]* ,多行模式没有设置)或者至less一个换行符( [\r\n]+ ),后面跟着至less一个换行符( [\r\n]+ )。 因此,在一个以一个或多个空行开始的string的特殊情况下,它们将被replace为一个空行。 我很确定这不是预期的结果。

但是大部分时间它是用一个换行replace两个或多个连续的换行符,以及位于它们之间的任何水平空格(空格或制表符)。 无论如何,这是意图。 作者似乎期望\s只匹配空格字符( \x20 ),实际上它匹配任何空格字符。 这是一个非常普遍的错误。 实际的列表从一个正则expression式到下一个不同,但是至less可以预期\s匹配任何[ \t\f\r\n]匹配。

其实,在PHP中你有一个更好的select:

 $str = preg_replace('/^\h*\v+/m', '', $str); 

\h匹配任何水平空格字符, \v匹配垂直空格。

上面杰米的链接Bythos的评论为我工作:

 /^\n+|^[\t\s]*\n+/m 

我不想删除所有新的行,只是空的/空白的。 这是诀窍!

只需将文本的行array_filter为一个数组,使用array_filter移除空行并再次使数组array_filter

 $tmp = explode("\n", $str); $tmp = array_filter($tmp); $str = implode("\n", $tmp); 

或者在一行中:

 $str = implode("\n", array_filter(explode("\n", $str))); 

我不知道,但这可能比preg_replace更快。

那这个呢?

 $str = preg_replace('^\s+\r?\n$', '', $str); 

试试这个:

 $str =preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\r\n", $str); 

如果你输出到一个文本文件,它会给简单的记事本,写字板和文本编辑器,如Notepad ++相同的输出。

 function trimblanklines($str) { return preg_replace('`\A[ \t]*\r?\n|\r?\n[ \t]*\Z`','',$str); } 

这只是从开始和结束,而不是中间(如果其他人正在寻找这个)。

接受的答案在string的末尾留下额外的换行符。 使用rtrim()将删除这个最后的linebreak:

 rtrim(preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $string)); 

从这个答案 ,为我工作得很好!

 $str = "<html> <body>"; echo str_replace(array("\r", "\n"), '', $str);