通过新行爆炸PHP字符串

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

$skuList = explode('\n\r', $_POST['skuList']);
395877 次浏览

对于一条新线来说,这只是

$list = explode("\n", $text);

对于一个新的行和回车(就像在Windows文件中一样),它就像你发布的那样。你的skuList是一个文本区域吗?

试试"\n\r"(双引号)或"\n"

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

涵盖所有情况。不要依赖于您的输入来自Windows环境。

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

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

你试过用双引号吗?

\n放在双引号中:

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

在单引号中,如果我没有记错的话,它被分别视为\n

首先,我认为它通常是\r\n,其次,这些在所有系统上都不相同。这只对窗口有效。试图弄清楚如何替换新行有点烦人,因为不同的系统对它们的处理不同(参见在这里)。如果你只使用\n,你可能会有更好的运气。

这里有很多东西:

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

考虑到最后一点,你可能会发现preg_split()使用所有可能的变量会给你一个比explode()更可靠的分割数据的方法。但是你也可以用explode()\n一起使用,然后用trim()删除任何\r字符。

试一试

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

在输入文本框中丢失换行符?< br > 对我来说,更快的工作是复制粘贴任何文本或Excel或HTML表格类型或换行数据类型,并将其粘贴到文本区域而不是输入文本框: 这将使换行符在POST中保持完整

 <textarea  id="txtArea" name="txtArea" rows="40" cols="170"></textarea>
<br>
<input type="submit" value="split lines into array" />

表单接收文件中:

 $txtArea ='';
$txtArea = $_POST['txtArea'];
$TA = $_POST['txtArea'];
$string = $TA;
$array = preg_split ('/$\R?^/m', $string);
// or any of these:
// $array = explode(PHP_EOL,$string);
// $array = explode("\n", $txtArea);
echo "<br>A0: ".$array[0];
echo "<br>A1: ".@$array[1];
echo "<br>A2: ".@$array[2];
这个php函数通过换行符爆炸字符串

注意:在窗户中的新行是\ r \ n,在LinuxUnix中的新行是\ n
这个函数将所有新行更改为linux模式,然后将其拆分。
注意空行将被忽略

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

示例< br >

$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
)

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

$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'])));

试试这个:

explode(PHP_EOF, $lines);

最佳实践

正如第一个答案的注释中提到的,最佳实践是使用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']);

虽然不完美,但我认为这是最安全的。添加nl2br:

$skuList = explode('<br />', nl2br($_POST['skuList']));

PHP_EOL表面上用于以跨平台兼容的方式查找换行符,因此它处理DOS/Unix问题。

试试这个:

$myString = "Prepare yourself to be caught
You in the hood gettin' shot
We going throw hell of blows
got my whole frame froze";


$myArray = explode(PHP_EOL, $myString);


print_r($myArray);

以下是对我有效的方法。在PHP 5.6和PHP 7.0中测试:

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


$skuList = preg_split("/\n/", $skuList);
print_r($skuList);

看起来很简单

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

你只需要传递准确的文本“\ n”,直接写入\ n被用作转义序列。因此“\ \”传递一个简单的反斜杠,然后放入“n”

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

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

https://www.php.net/manual/en/regexp.reference.escape.php#:~:text=line%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',
)

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

$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']);
< p > 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 < / p >

并且在运行这些测试的项目上成功运行CI:
https://github.com/rosell-dk/exec-with-fallback/actions/runs/1520070091 < / p > < p > 原理的Javascript演示
下面是一些类似正则表达式的javascript演示(我使用N和R而不是\ N和\ R)

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

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