Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中删除文本中的空行?_Php_Regex - Fatal编程技术网

如何在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); 上面的

我需要删除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);
上面的正则表达式表示:

/(^[\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);