识别文本区域中的空白行

时间:2013-08-06 15:10:20

标签: php

我正在尝试识别字符串中的空白行。以下是我在PHP中的尝试:

<?php 
$alldevs = $_POST['devs'];
$devices = explode("\n", $alldevs);

foreach($devices as $device) {
    if(!empty($device)){
        echo $device;
    } else {
        echo "end of value";
    }
}
?>

当我输入以下内容时:

1
2
3

4

我得到了这个输出:

1
2
3

4

但它应该输出的是:

1
2
3
end of value
end of value
4

我做错了什么?

6 个答案:

答案 0 :(得分:2)

它们可能包含\r(在某些浏览器/操作系统的文本区域中的新行上发布),空格或制表符。您可以使用trim()命令删除这些:

<?php 
    $alldevs = $_POST['devs'];
    $devices = explode("\n", $alldevs);
    foreach ($devices as $device) {
        $device = trim($device); //Trim that string!
        if(!empty($device)) 
        {
            echo $device;
        }
        else
        {
            echo "end of value";
        }
    }
?>

哦,请为您自己的代码缩进代码,为了每个人的利益

或者,使用正则表达式分割字符串:

$devices = preg_split("/(\r\n|\n\r|\r|\n)/", $alldevs);

答案 1 :(得分:2)

这可以给你你想要的东西:

if( trim($device) !== '' )
{
    echo $device."<br>";
}
else
{
    echo "end of value"."<br>";
}

输出:

1 
2 
3 
end of value
4

答案 2 :(得分:1)

我认为你的问题出在\r\n

使用此代码

$alldevs = str_replace("\r", '', $alldevs);

然后将其爆炸,并将trim用于清洁空间

$alldevs = trim($alldevs);

答案 3 :(得分:1)

首先,请阅读dealing with line endingswikipedia newline

第二,当你应该使用像preg_match_all

这样的函数时,你正在使用字符串爆炸

代码应该看起来像这样(请注意坏的正则表达式):

<?php
$string = $_POST['devs'];
preg_match_all('%^([^\n\r]*)[\n\r]?$%im', $string, $matches);
foreach ($matches[1] as $match) {
    if($match) {
        var_dump($match);
    } else {
        echo 'empty line' . PHP_EOL;
    }
}

调整此代码以满足您的需求,我在那里留下了一个var_dump,以便您可以看到字符串长度。

答案 4 :(得分:0)

添加对超过0个字符的字符串的检查,

if(!empty($device) && strlen($device)>0) {

我还会在您的换行符上尝试使用\r\n的用例,您也会遇到这种情况。

答案 5 :(得分:0)

你可以试试这个

$devices = preg_replace('/^\s*$/','end of value',explode("\n",$alldevs));
foreach($devices as $device) {
    echo $device, "\n";
}