如何在PHP中删除文本中的空行?
我需要删除PHP中的空行(带空格或完全空白)。我使用此正则表达式,但它不起作用:如何在PHP中删除文本中的空行?,php,regex,Php,Regex,我需要删除PHP中的空行(带空格或完全空白)。我使用此正则表达式,但它不起作用: $str = ereg_replace('^[ \t]*$\r?\n', '', $str); $str = preg_replace('^[ \t]*$\r?\n', '', $str); 我想要一个结果: blahblah blahblah adsa sad asdasd 将: 使用以下命令: $str = preg_replace('^\s+\r?\n$', '', $str); 上面的
$str = ereg_replace('^[ \t]*$\r?\n', '', $str);
$str = preg_replace('^[ \t]*$\r?\n', '', $str);
我想要一个结果:
blahblah
blahblah
adsa
sad asdasd
将:
使用以下命令:
$str = preg_replace('^\s+\r?\n$', '', $str);
上面的正则表达式表示:
/(^[\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()
解决方案是错误的,因为ereg/eregi
方法已被弃用。您的preg_replace()
甚至不会编译,但如果添加分隔符并设置多行模式,它将正常工作:
$str = preg_replace('/^[ \t]*[\r\n]+/m', '', $str);
m
修饰符允许^
匹配逻辑行的开头,而不仅仅是整个字符串的开头。开始行锚是必要的,因为如果没有它,正则表达式将匹配每行结束时的换行符,而不只是空白行。您不需要行尾定位($
),因为您正在积极匹配换行符,但这不会造成任何伤害
工作完成了,但比需要的复杂。正则表达式必须匹配字符串的开头(^[\r\n]*
,未设置多行模式)或至少一个换行符([\r\n]+
),后跟至少一个换行符([\r\n]+
)。因此,在以一个或多个空行开头的字符串的特殊情况下,它们将替换为一个空行。我很确定这不是理想的结果
但大多数情况下,它会用一个换行符替换两个或多个连续的换行符,以及它们之间的任何水平空格(空格或制表符)。无论如何,这就是目的。作者似乎期望\s
只匹配空格字符(\x20
),而实际上它匹配任何空格字符。这是一个很常见的错误。实际的列表在不同的正则表达式风格中有所不同,但您至少可以期望\s
匹配任何[\t\f\r\n]
匹配的内容
实际上,在PHP中,您有一个更好的选择:
$str = preg_replace('/^\h*\v+/m', '', $str);
\h
匹配任何水平空白字符,\v
匹配垂直空白字符
function trimblanklines($str) {
return preg_replace('`\A[ \t]*\r?\n|\r?\n[ \t]*\Z`','',$str);
}
这一条只从开头和结尾删除它们,而不是从中间删除(如果其他人正在寻找这一条)。上面杰米的链接对我有用:
/^\n+|^[\t\s]*\n+/m
我不想去掉所有的新行,只是那些空的/空白的。这就成功了 试试这个:
$str = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\r\n", $str);
如果您将其输出到文本文件,它将在简单文本和文本编辑器(例如)中提供相同的输出。接受的答案在字符串末尾留下额外的换行符。使用
rtrim()
将删除此最终换行符:
rtrim(preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $string));
只需将文本的行分解为一个数组,使用
array\u filter
删除空行,然后再次内爆数组
$tmp = explode("\n", $str);
$tmp = array_filter($tmp);
$str = implode("\n", $tmp);
或者在一行中:
$str = implode("\n", array_filter(explode("\n", $str)));
我不知道,但是这可能比preg\u replace快,下面的工作对我来说很好
$str = "<html>
<body>";
echo str_replace(array("\r", "\n"), '', $str);
$str=”
";
echo str_替换(数组(“\r”,“\n”),“$str”);
没有必要使事情过于复杂。这可以通过一个简单的短正则表达式实现:
$text=preg_replace(“/(\R){2,}/”,“$1,$text”);
(\R)
匹配所有换行符{2,}
匹配两个或多个匹配项$1
使用第一个反向引用(特定于平台的EOL)作为替换。nl2br(preg_replace('/^\v+/m',''.$r_msg))这里还可以找到:return preg_replace(“/(^[\r\n]*.[\r\n]+)[\s\t]*[\r\n]+/”,“,“\r\n”,$string);这项工作你能确切地解释正则表达式是做什么的吗?我不喜欢使用我一无所知的代码。我同意@StoneHeart中的sol'n,但有一些细微的变化。因此:preg\u replace(“/(^[\r\n]*.[\r\n]+)[\s\t]*[\r\n]+/”,PHP\u EOL,$string)
。使用PHP\u EOL
然后启用将允许您拥有解释器真正理解的一致的换行字符。\h
要求pcre引擎是最低版本,否则结果就是噩梦。请注意。虽然此代码可能会回答此问题,但提供有关此代码为什么和/或如何回答此问题的其他上下文可以提高其长期价值。Ben,这不起作用,因为您将“\n”中的“n”数分解,然后添加相同的“\n”数并重新生成相同的字符串。您确实尝试过吗<代码> ARAYAYFILTER()/<代码>删除使用<代码>爆炸()/<代码>创建的数组的空白元素。这是与所选答案相同的答案99.9%。也许你可以尝试一些独特的东西,这实际上有助于回答最初的问题。你不是在解释正则表达式是做什么的!我们不应该使用trim($str)代码>它为您的答案提供了窍门@班蒂亚,这完全不一样。My函数删除前导和尾随的完全空白/空白行,就像从文本段落中删除一样。如果第一行是空白的,第二行是缩进的,这些空格即使在开头也不会被触及。请不要只发布代码作为答案,还要解释代码的作用以及它是如何解决问题的。带有解释的答案通常质量更高,更有可能吸引更多的选票。为什么要在结果中添加
?
<?php
function del_blanklines_in_array_q($ar){
$strip = array();
foreach($ar as $k => $v){
$ll = strlen($v);
while($ll--){
if(ord($v[$ll]) > 32){ //hex /0x20 int 32 ascii SPACE
$strip[] = $v; break;
}
}
}
return $strip;
}
function del_blanklines_in_file_q($in, $out){
// in filename, out filename
$strip = del_blanklines_in_array_q(file($in));
file_put_contents($out, $strip );
}
$str = "<html>
<body>";
echo str_replace(array("\r", "\n"), '', $str);
<?php
function del_blanklines_in_array_q($ar){
$strip = array();
foreach($ar as $k => $v){
$ll = strlen($v);
while($ll--){
if(ord($v[$ll]) > 32){ //hex /0x20 int 32 ascii SPACE
$strip[] = $v; break;
}
}
}
return $strip;
}
function del_blanklines_in_file_q($in, $out){
// in filename, out filename
$strip = del_blanklines_in_array_q(file($in));
file_put_contents($out, $strip );
}
$file = "file_name.txt";
$file_data = file_get_contents($file);
$file_data_after_remove_blank_line = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $file_data );
file_put_contents($file,$file_data_after_remove_blank_line);