简单,是吧?嗯,这是行不通的:-\

$skuList = explode('\n\r', $_POST['skuList']);

当前回答

保留换行符(作为数组中的空白项):

$skuList = preg_split('/\r\n|\n\r|\r|\n/', $_POST['skuList']);`

它处理不寻常的\n\r以及常见的\n\r, \n和\r。注意,来自@Alin_Purcaru的解决方案非常相似,但不处理\n\r。

删除换行符(数组中没有空白项):

$skuList = preg_split('/[\r\n]+/', $_POST['skuList']);

PHP测试 这些表达式已在以下操作系统上测试:ubuntu-20.04, ubuntu-18.04, windows-2022, windows-2019, windows-2016, macos-11, macos-10.15和以下PHP版本:8.0,7.4,7.3,7.2,7.1,7.0

下面是PHP测试类: https://github.com/rosell-dk/exec-with-fallback/blob/main/tests/LineSplittingTest.php

一个成功的CI运行在一个运行这些测试的项目上: https://github.com/rosell-dk/exec-with-fallback/actions/runs/1520070091

原理的Javascript演示 下面是一些类似正则表达式的javascript演示(我使用N和R而不是\ N和\ R)。

保留换行演示:https://regexr.com/6ahvl 删除换行演示:https://regexr.com/6ai0j

PS:目前在regexr中有一个错误,导致它在第一次加载时显示“错误”。编辑表达式可以消除错误

其他回答

如果内容可能在系统外部生成,那么系统使用什么作为换行符并不重要。

在收到所有这些答案后,我很惊讶,没有人简单地建议使用\R转义序列。只有一种方法可以让我考虑在自己的项目中实现它。\R提供了最简洁和直接的方法。

https://www.php.net/manual/en/regexp.reference.escape.php # ~:短信=线% 20break: 20matches % 20 \ n % 20, r 20and % 20 \ r \ n

代码:(演示)

$text = "one\ntwo\r\nthree\rfour\r\n\nfive";

var_export(preg_split('~\R~', $text));

输出:

array (
  0 => 'one',
  1 => 'two',
  2 => 'three',
  3 => 'four',
  4 => '',
  5 => 'five',
)

你试过用双引号吗?

试试这个:

explode(PHP_EOF, $lines);

try

explode(chr(10), $_POST['skuList']);

这个PHP函数用换行符拆分字符串 注意:Windows中的新行是\r\n, Linux和Unix中的新行是\n 这个函数将所有新行更改为Linux模式,然后将其拆分。注意,空行将被忽略

function splitNewLine($text) {
    $code=preg_replace('/\n$/','',preg_replace('/^\n/','',preg_replace('/[\r\n]+/',"\n",$text)));
    return explode("\n",$code);
}

例子

$a="\r\n\r\n\n\n\r\rsalam\r\nman khobam\rto chi\n\rche khabar\n\r\n\n\r\r\n\nbashe baba raftam\r\n\r\n\r\n\r\n";
print_r( splitNewLine($a) );

输出

Array
(
    [0] => salam
    [1] => man khobam
    [2] => to chi
    [3] => che khabar
    [4] => bashe baba raftam
)