【问题标题】:PHP: Exploding string => last element is empty, but not recognized as emptyPHP:爆炸字符串=>最后一个元素为空,但未被识别为空
【发布时间】:2022-01-04 16:29:06
【问题描述】:

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

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

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

我首先用explode("\n", $string); 分解几行。 二、我爆了每一行的元素:explode(";", $string[0]);

key 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 总是说只有最后一行的最后一个元素是空的,尽管每个最后一个元素都是空的?

非常感谢您!

【问题讨论】:

  • 我唯一能想到的是行尾是\r\n,而不是\n。您可以使用PHP_EOL 而不是"\n" 进行初始爆炸。如果它们不为空,您可以使用var_dump($line1[6]); 查看这些行所包含的内容
  • 不可重现,使用显示的代码,并假设行以\n 结尾:sandbox.onlinephpfunctions.com/code/…。但是,如果正如任何人所暗示的那样,行尾实际上是\r\n:sandbox.onlinephpfunctions.com/code/…
  • 添加您的表单代码。并告诉我们浏览器和平台。
  • array_map('trim', explode("\n", $string))
  • P.S. var_dump 为您提供比 print_r 更详细的反馈,包括字符串的长度 - 其内容可能不包含任何可见字符....

标签: php explode


【解决方案1】:

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

<?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 换行序列。 (如有错误请更正此定义。)

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

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多