我需要在PHP中删除空行(空白或绝对空白)。我使用这个正则表达式,但它不起作用:
$str = ereg_replace('^[ \t]*$\r?\n', '', $str);
$str = preg_replace('^[ \t]*$\r?\n', '', $str);
我想要结果:
blahblah
blahblah
adsa
sad asdasd
意愿:
blahblah
blahblah
adsa
sad asdasd
答案 0 :(得分:71)
// New line is required to split non-blank lines
preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $string);
上面的正则表达式说:
/(^[\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)
答案 1 :(得分:24)
您的ereg-replace()
解决方案错误,因为不推荐使用ereg/eregi
方法。您的preg_replace()
甚至无法编译,但如果您添加分隔符并设置多行模式,它将正常工作:
$str = preg_replace('/^[ \t]*[\r\n]+/m', '', $str);
m
修饰符允许^
匹配逻辑行的开头,而不仅仅是整个字符串的开头。起始线锚是必要的,因为如果没有它,正则表达式将匹配每行末尾的换行符,而不仅仅是空行换行符。你不需要行结束锚($
),因为你主动匹配换行符,但它不会受到伤害。
accepted answer完成了工作,但它比它需要的更复杂。正则表达式必须匹配字符串的开头(^[\r\n]*
,多行模式未设置)或至少一个换行符([\r\n]+
),后跟至少一个换行符([\r\n]+
)。因此,在以一个或多个空行开头的字符串的特殊情况下,它们将被替换为一个空白行。我很确定这不是理想的结果。
但它在大多数情况下所做的是用一个换行符替换两个或多个连续的换行符,以及位于它们之间的任何水平空格(空格或制表符)。无论如何,那是意图。作者似乎希望\s
只匹配空格字符(\x20
),而实际上它匹配任何空格字符。这是一个非常常见的错误。实际列表从一种正则表达式风格到下一种风格不同,但至少可以\s
匹配任何[ \t\f\r\n]
次匹配。
实际上,在PHP中你有更好的选择:
$str = preg_replace('/^\h*\v+/m', '', $str);
\h
匹配任何水平空格字符,\v
匹配垂直空格。
答案 2 :(得分:10)
只需将文本行分解为数组,使用array_filter
删除空行并再次内爆数组。
$tmp = explode("\n", $str);
$tmp = array_filter($tmp);
$str = implode("\n", $tmp);
或者在一行中:
$str = implode("\n", array_filter(explode("\n", $str)));
我不知道,但这可能比preg_replace
更快。
答案 3 :(得分:6)
答案 4 :(得分:1)
这是怎么回事?
$str = preg_replace('^\s+\r?\n$', '', $str);
答案 5 :(得分:1)
试试这个:
$str =preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\r\n", $str);
如果将其输出到文本文件,它将在简单的记事本,写字板以及文本编辑器(如Notepad ++)上提供相同的输出。
答案 6 :(得分:1)
没有必要使事情过于复杂,这可以通过一个简单的短正则表达式来实现:
(\R)
{2,}
匹配所有换行符
$1
匹配两次或多次匹配
df %>%
distinct() %>%
filter(threshold ==2 | threshold==4)
#> loc.id threshold
#> 1 1 2
#> 2 1 4
#> 3 2 2
#> 4 2 4
```
使用第一个反向引用(特定于平台的EOL)作为替换
答案 7 :(得分:0)
function trimblanklines($str) {
return preg_replace('`\A[ \t]*\r?\n|\r?\n[ \t]*\Z`','',$str);
}
这个只从开头和结尾删除它们,而不是中间(如果有其他人在寻找这个)。
答案 8 :(得分:0)
接受的答案会在字符串末尾留下额外的换行符。使用rtrim()
将删除此最终换行符:
rtrim(preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $string));
答案 9 :(得分:0)
来自this answer,对我来说工作正常!
$str = "<html>
<body>";
echo str_replace(array("\r", "\n"), '', $str);
答案 10 :(得分:0)
<?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 );
}
答案 11 :(得分:0)
$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);
答案 12 :(得分:-1)
nl2br(preg_replace('/ ^ \ v + / m','',$ r_msg))