用新行爆炸PHP字符串


253

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

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

28
单引号表示“不解析此字符串”。@ Select0r的答案可能就是您想要的。
Ryan Kinal

3
如何删除新行并从php字符串返回的可能重复项这已经是Reliablely从字符串其他一些消息中删除新闻行的副本。在提出问题之前,请使用前面板搜索功能!
戈登

1
@戈登:哈,我看到了夏普纳尔上校在另一个问题中所说的话。有点伤感。不过,请加上我的密切投票。
BoltClock

9
除了其他人提到的单引号之外,CRLF对\r\n也不例外。
Powerlord 2010年

1
尝试记住:\ R
etur

Answers:


410

最佳实践

如第一个答案的注释中所述,最佳实践是使用PHP常量PHP_EOL,它代表当前系统的EOL(行)。

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

PHP提供了许多其他非常有用的常量,您可以使用它们使代码系统独立,请参见此链接以找到有用的且与系统无关的目录常量。

警告

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

更新

Andreas的评论使我意识到,此处介绍的“最佳实践”解决方案不适用于所描述的用例:服务器的EOL(PHP)与浏览器(任何OS)使用的EOL没有任何关系,但是(浏览器)是字符串的来源。

因此,请使用@Alin_Purcaru中的解决方案(三步向下)覆盖您的所有基础(并赞扬他的回答):

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

5
这是一个新的答案,但可能是最好的,也是正确的答案
frazras 2015年

这很奇怪,因为它就是PHP希望您这样做的方式:)您能给我更多有关您的OS和PHP版本的详细信息吗,也许是PasteBin或某物上的一段代码。类似?
Larzan 2015年

16
您不能使用PHP_EOL,因为系统和输入源之间没有任何关系。如果用户在Windows中添加新行并且PHP在Linux上运行,则结果可能会损坏。
barell

1
@barell确切地说,这就是我在“警告”部分中描述的情况;)问题没有明确指出它是存储在数据库中的旧输入。请阅读“警告”部分,您将看到我在此介绍了这种情况。
拉赞,2016年

7
对于这个用例,这个答案是错误的。在这种情况下,请勿使用PHP_EOL常量,因为输入源(例如用户的浏览器)肯定不是您的系统。使用能够解决所有不同行尾的解决方案(Alin Purcaru的回答)。
安德烈亚斯

241

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

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

要么

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

21
如果eol为,这将导致数组元素为空\r\n。为了防止这种情况,无论是使用:preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);(注意,\r\n使用该标志时不需要),或者干脆把\r\n 之前\rpreg_split('/\r\n|\n|\r/', $_POST['skuList']);
webbiedave

2
@webbiedave PREG_SPLIT_NO_EMPTY很好,但是它将删除空行。这可能是理想的,也可能不是理想的。
jms

这种模式将为我匹配所有字母,因为即使没有任何提示,它也会成功。“?” 表示0或1次,因此即使\ r和\ n都不存在,也有可能匹配。您说“固定”,但我看不到。我改用/(\ r | \ n)+ /。
罗尔夫(Rolf)2013年

1
@Rolf看来我急忙进行了编辑。现在已更正。您应该使用什么取决于您是否要在输出中留空行。我的答案中的选项还返回空行。
Alin Purcaru

3
@AlinPurcaru您能否在答案中阐明哪些(两者都没有?)将返回空白,而哪些则不会?
帕特里克

150

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

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


52
PHP中的单引号表示“不解析此字符串”。这意味着您的控制字符没有被解析,它们被当作文字(不是换行符和回车符,而是实际的文字'\ n \ r')。使用双引号表示“解析此字符串”,因此将解析您的控制字符。+1
Ryan Kinal

17
/n/r?我知道OP写道,但是正确的Windows eol是\r\n
webbiedave 2012年

20
考虑PHP 行尾常量:PHP_EOL
Daniel W.

大家好,这绝对是正确的答案!我想知道为什么@Alin Purcaru的答案获得了44票。。尽管看起来确实可以完成工作,但它并非总是能正常工作。.因此,这是我对坚持同一件事的任何人的评论
Rafik Bari

3
只是不理会\ r,最后一个不使用\ n的操作系统是OS9(en.wikipedia.org/wiki/Newline#Representations)。因此,这将为您带来最佳效果:explode("\n", str_replace("\r", '', $string));
DanielM

15

这里有很多东西:

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

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


好答案。简洁,涵盖了所有内容。谢谢!
Kosta Kontos

11

此php函数通过换行符爆炸字符串

注意Windows中的新行是\ 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);
}


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


6

对于一条新线,它只是

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

对于新行和回车符(如Windows文件中一样),与您发布的一样。您的skuList是文本区域吗?




3

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

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


1

看起来很容易

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

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


0

首先,我认为通常是这样\r\n,其次,在所有系统上都不一样。那只会在Windows上起作用。试图找出如何替换新行是一种烦人的做法,因为不同的系统对它们的处理方式有所不同(请参阅此处)。你也许会拥有更好的运气\n


0

如果其他人尝试过此方法,但没有成功,则提醒您您可能做过与我相同的大脑放屁。

mysql是否先逃脱了字符串?在这种情况下,换行符不再是换行符。

我没有做任何避免解析的事情,只是通过'\ n'(字面反斜杠和n而不是实际的换行符)进行了修改和分解。


3
在mysql转义后执行任何字符串操作绝对没有任何意义
您的常识2012年

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

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

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

0

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

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


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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.