PHP: 爆炸字符串 => 最后一个元素为空,但未被识别为空

PHP: Exploding string => last element is empty, but not recognized as empty

我正在为 PHP 中的行为而苦苦挣扎,最终需要在 Whosebug 上注册,因为我第一次找不到问题的任何答案! :D

在我的代码中,我从文本区域(多行)获取以下内容:

10001;11;;;1;3;
10002;11;;;1;3;
10003;11;;;1;3;

我首先用explode("\n", $string);展开几行。 二、我把每一行的元素都爆出来:explode(";", $string[0]);

键6内容为空,但PHP只识别最后一行最后一个元素为空:

展开行
explode("\n", $string);

Array ( [0] => 10001;11;;;1;3; [1] => 10002;11;;;1;3; [2] => 10003;11;;;1;3; )

展开第一行
explode(";", $string[0]);

Array ( [0] => 10001 [1] => 11 [2] => [3] => [4] => 1 [5] => 3 [6] => )

第一行的最后一个元素是否为空?

( if(empty($line1[6]) )

没有

爆炸第二行

explode(";", $string[1]);

Array ( [0] => 10002 [1] => 11 [2] => [3] => [4] => 1 [5] => 3 [6] => )

第二行的最后一个元素是否为空?

( if(empty($line2[6]) )

没有

爆炸第三行

explode(";", $string[2]);

Array ( [0] => 10003 [1] => 11 [2] => [3] => [4] => 1 [5] => 3 [6] => )

第三行最后一个元素是否为空?

( if(empty($line3[6]) )

谁能告诉我,为什么 PHP 总是说只有最后一行的最后一个元素是空的,尽管每个最后一个元素都是空的?

非常感谢您!

浏览器正在使用回车 return 换行规范化行分隔。因此,当您在换行符上拆分时,最后一部分仍然有一个回车 return。

<?php
$data = $_POST['data'];

$lines = explode("\n", $data);
//$lines = preg_split('@\R@', $data);

foreach($lines as $line) {
    $parts = explode(';', $line);
    var_dump(empty($parts[6]));
}
?>
<form method='POST'>
    <textarea name='data'>10001;11;;;1;3;
10002;11;;;1;3;
10003;11;;;1;3;</textarea>
    <input type='submit'>
</form>

输出(没有表单提交时的表单代码):

bool(false)
bool(false)
bool(true)

将爆炸线换成上面的 preg_split,输出为:

bool(true)
bool(true)
bool(true)

\R 转义序列匹配任何 Unicode 换行序列。 (定义有误请指正。)

注意尾随 space 可能是个问题。小心用户输入。