如何从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);