0

我正在尝试识别字符串中的空行。以下是我在 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

我究竟做错了什么?

4

6 回答 6

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);
于 2013-08-06T15:13:23.610 回答
2

这应该给你你想要的:

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

输出:

1 
2 
3 
end of value
4
于 2013-08-06T15:27:56.540 回答
1

首先,请阅读处理行尾维基百科换行

其次,当您应该使用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 以便您可以看到字符串长度。

于 2013-08-06T15:37:19.477 回答
1

我认为你的问题是\r\n

使用此代码

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

然后爆炸它,也trim用于清洁空间

$alldevs = trim($alldevs);
于 2013-08-06T15:17:41.240 回答
0

你可以试试这个

$devices = preg_replace('/^\s*$/','end of value',explode("\n",$alldevs));
foreach($devices as $device) {
    echo $device, "\n";
}
于 2013-08-06T15:24:04.503 回答
0

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

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

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

于 2013-08-06T15:13:16.753 回答