很简单,对吧?不过,这行代码似乎有问题 :-\
$skuList = explode('\n\r', $_POST['skuList']);
最佳实践
如第一个答案中的评论所述,最佳实践是使用 PHP 常量PHP_EOL,该常量表示当前系统的行尾(End Of Line)。
$skuList = explode(PHP_EOL, $_POST['skuList']);
PHP提供了许多其他非常有用的常量,您可以使用它们使您的代码与系统无关,请参见此链接以查找有用且与系统无关的目录常量。
警告
这些常量使您的页面与系统无关,但是当您将使用这些常量与存储在另一个系统上的数据移动到另一个系统时,您可能会遇到问题。新系统的常量可能与先前系统的常量不同,并且存储的数据可能不再起作用。因此,在将数据存储到文件之前,请完全解析数据以删除任何系统相关部分。
更新
Andreas的评论使我意识到,我在此处提供的“最佳实践”解决方案并不适用于所描述的用例:服务器的EOL(PHP)与浏览器(任何操作系统)正在使用的EOL没有任何关系,但(浏览器)是字符串来自的地方。
因此,请使用 @Alin_Purcaru 的解决方案来覆盖您的所有基础:
$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);
覆盖所有情况,不要依赖于输入来自Windows环境。
$skuList = preg_split("/\\r\\n|\\r|\\n/", $_POST['skuList']);
或者$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);
\r\n
,则会导致数组元素为空。为了避免这种情况,可以使用以下方法之一: preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);
(注意,使用该标志时\r\n
变得不必要),或者在\r
之前 插入 \r\n
: preg_split('/\r\n|\n|\r/', $_POST['skuList']);
- webbiedave尝试使用"\n\r"
(双引号)或只使用"\n"
。
如果您不确定具有哪种类型的EOL,请在分割字符串之前运行str_replace,将"\n\r"
替换为"\n"
。
/n/r
? I know the OP wrote that but the correct windows eol is \r\n
- webbiedavePHP_EOL
。 - Daniel W.$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',
)
使用正则表达式引擎根据一个或多个换行序列进行拆分
var_export(preg_split('~\R+~', $text)); // 可能会在数组的开头和/或结尾生成空元素
删除长度为零的元素
var_export(preg_split('~\R~', $text, -1, PREG_SPLIT_NO_EMPTY));
[最佳] 使用正则表达式引擎根据一个或多个换行序列进行拆分,并删除长度为零的元素
var_export(preg_split('~\R+~', $text, -1, PREG_SPLIT_NO_EMPTY));
尝试
explode(chr(10), $_POST['skuList']);
这里有很多内容:
\r\n
,而不是 \n\r
。\n
,没有\r
(甚至在非典型情况下,可能只有\r
)。鉴于最后一点,您可能会发现使用所有可能的变量的preg_split()
会比使用explode()
更可靠地拆分数据。但是您也可以仅使用\n
来使用explode()
,然后使用trim()
删除任何悬挂的\r
字符。
这个 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
)
var_export(preg_split('~\R+~', $a, 0, PREG_SPLIT_NO_EMPTY));
。其他任何方法都不是聪明的做法。演示 - mickmackusa$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
并且此项目成功运行了这些测试:
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
附注:目前regexr存在一个错误,会在首次加载时显示“错误”。修改表达式即可消除错误。
对于换行,只需使用
$list = explode("\n", $text);
如果需要换行和回车(例如Windows文件),可以按照您发布的方式进行。 您的skuList是一个文本区域吗?
将\n
放在双引号中:
explode("\n", $_POST['skuList']);
如果我没记错的话,在单引号中,这会被视为\
和n
分别处理。
\r\n
而不是相反的。 - Powerlord