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

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

当前回答

这里有很多东西:

您需要使用双引号,而不是单引号,否则转义字符将不会被转义。 正常的序列是\r\n,而不是\n\r。 根据来源的不同,你可能只得到不带\r的\n(甚至在不寻常的情况下,可能只有\r)。

考虑到最后一点,您可能会发现使用所有可能的变体的preg_split()将为您提供比explosion()更可靠的数据分割方式。但是,您也可以只使用\n来使用explosion(),然后使用trim()来删除剩下的\r字符。

其他回答

试试“\n\r”(双引号)或者“\n”。

如果您不确定您拥有哪种类型的EOL,在爆炸之前运行str_replace,将“\n\r”替换为“\n”。

这个方法对我来说总是有效的:

$uniquepattern="@#$;?:~#abcz"//Any set of characters which you dont expect to be present in user input $_POST['skuList'] better use atleast 32 charecters.
$skuList=explode($uniquepattern,str_replace("\r","",str_replace("\n",$uniquepattern,$_POST['skuList'])));

最佳实践

正如第一个答案的注释中提到的,最佳实践是使用PHP常量PHP_EOL,它表示当前系统的EOL(行结束)。

$skuList = explode(PHP_EOL, $_POST['skuList']);

PHP提供了许多其他非常有用的常量,您可以使用这些常量使您的代码独立于系统,请参阅此链接以查找有用且独立于系统的目录常量。

警告

这些常量使您的页面系统独立,但是当您将这些常量用于存储在另一个系统上的数据时,从一个系统转移到另一个系统时可能会遇到问题。新系统的常数可能与以前的系统不同,存储的数据可能不再工作。因此,在存储数据之前完全解析数据,以删除任何与系统相关的部分。

更新

Andreas的评论让我意识到我在这里提出的“最佳实践”解决方案并不适用于所描述的用例:服务器的EOL (PHP)与浏览器(任何操作系统)正在使用的EOL没有任何关系,但(浏览器)是字符串的来源。

所以请使用@Alin_Purcaru的解决方案来覆盖你所有的基础:

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

try

explode(chr(10), $_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中有一个错误,导致它在第一次加载时显示“错误”。编辑表达式可以消除错误