按新行分解PHP字符串

时间:2010-10-22 13:39:12

标签: php

简单,对吧?嗯,这不起作用: - \

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

20 个答案:

答案 0 :(得分:338)

最佳实践

正如第一个答案的评论中所提到的,最佳做法是使用代表当前系统的EOL( End Of Line )的PHP常量PHP_EOL

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

PHP提供了许多其他非常useful constants可用于使代码系统独立的内容,请参阅this link以查找有用且与系统无关的目录常量。

警告

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

<强>更新

安德烈亚斯&#39;评论让我意识到最佳实践&#39;我在这里提出的解决方案不适用于所描述的用例:服务器的EOL(PHP)与浏览器(任何操作系统)正在使用的EOL没有任何关系,但是(浏览器)是字符串来自。

所以请使用@Alin_Purcaru(three down)的解决方案来涵盖你的所有基础(并提出他的回答):

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

答案 1 :(得分:200)

涵盖所有案件。不要依赖您的输入来自Windows环境。

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

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

答案 2 :(得分:148)

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

如果您不确定自己的EOL类型,请在爆炸前运行str_replace,将“\ n \ r”替换为“\ n”。

答案 3 :(得分:13)

这里有很多东西:

  • 您需要使用双引号,而不是单引号,否则转义的字符不会被转义。
  • 正常序列为\r\n,而不是\n\r
  • 根据消息来源,您可能只是\n而没有\r(或者甚至在不常见的情况下,可能只是\r

鉴于最后一点,您可能会发现preg_split()使用所有可能的变体将为您提供比explode()更可靠的分割数据的方式。但另外,您可以explode()只使用\n,然后使用trim()删除任何遗留下来的\r个字符。

答案 4 :(得分:11)

这个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
)

答案 5 :(得分:9)

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

答案 6 :(得分:6)

对于新行,它只是

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

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

答案 7 :(得分:4)

\n放在双引号中:

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

在单引号中,如果我没有记错,则将其分别视为\n

答案 8 :(得分:3)

您是否尝试使用双引号?

答案 9 :(得分:3)

不完美,但我认为它必须是最安全的。添加nl2br

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

答案 10 :(得分:1)

试试这个:

explode(PHP_EOF, $lines);

答案 11 :(得分:1)

如果内容可以在系统外部生成,则系统用作换行符并不重要。

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

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

代码:(Demo

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

答案 12 :(得分:0)

首先,我认为它通常是\r\n,其次,在所有系统上都不一样。这只适用于Windows。尝试弄清楚如何替换新行是很烦人的,因为不同的系统对它们的处理方式不同(参见here)。仅\n可能会有更好的运气。

答案 13 :(得分:0)

如果其他人尝试了这个但它没有用,那么这提醒你,你可能和我一样做了大脑放屁。

你有没有mysql首先转义字符串?在这种情况下,换行符不再是换行符。

我没有做任何事情来避免解析它,只是通过'\ n'(字面上的反斜杠和 n 而不是实际的换行符来调整和爆炸。

答案 14 :(得分:0)

输入文本框中的帖子丢失换行符?
对我来说更快的是复制粘贴任何文本或Excel或HTML表格类型或换行类型的数据并将其粘贴到textarea而不是inputextbox: 这样可以使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];

答案 15 :(得分:0)

此方法始终适用于我:

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

答案 16 :(得分:0)

  

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

答案 17 :(得分:0)

您可以使用正则表达式进行尝试:

To: =?UTF-8?B?QmzDtmRtYW5u?= <guru@sisis.de>, =?UTF-8?B?R3Jvw59tYW5u?= <guru@example.com>

答案 18 :(得分:0)

这对我有用。在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);

答案 19 :(得分:0)

看起来很简单

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

您只需要传递确切的文本“ \ n” ,直接编写 \ n 即可用作转义序列。因此,“ \\” 传递一个简单的反斜杠,然后放置“ n”