如何把string放在数组中,按新行分割?

我的数据库中有换行符的string。 我想将该string转换为一个数组,并为每一个新行,跳转数组中的一个索引位置。

如果string是:

我的文字1
我的text2
我的文字3

我想要的结果是这样的:

Array ( [0] => My text1 [1] => My text2 [2] => My text3 ) 

您可以使用explodefunction,使用“ \n ”作为分隔符:

 $your_array = explode("\n", $your_string_from_db); 

例如,如果你有这段代码:

 $str = "My text1\nMy text2\nMy text3"; $arr = explode("\n", $str); var_dump($arr); 

你会得到这个输出:

 array 0 => string 'My text1' (length=8) 1 => string 'My text2' (length=8) 2 => string 'My text3' (length=8) 

请注意,您必须使用双引号string ,所以\n实际上被解释为换行符。
(有关更多详细信息,请参见手册页)

换行符在不同的平台上定义不同,\ r \ n,\ r或\ n。

使用RegExp分割string,你可以用\ R匹配所有三个string

所以对于你的问题:

 $array = preg_split ('/$\R?^/m', $string); 

这将符合Windows,Mac和Linux上的换行符!

我一直使用这个很成功的:

 $array = preg_split("/\r\n|\n|\r/", $string); 

(更新最后\ r,谢谢@LobsterMan)

PHP已经知道当前系统的换行符。 只要使用EOL常量。

 explode(PHP_EOL,$string) 

大卫回答更快(方式更快)的替代方法是使用str_replaceexplode

 $arrayOfLines = explode("\n", str_replace(array("\r\n","\n\r","\r"),"\n",$str) ); 

发生什么事情是:
由于换行符可以以不同的forms出现,因此我将str_replace \ r \ n,\ n \ r和\ r改为\ n(并保留原来的\ n)。
然后在\n上爆炸,你有一个数组中的所有行。

我在这个页面的src上做了一个基准testing,并在for循环中分割了1000次:
preg_replace花费了11秒的平均时间
str_replace & explode花费了大约1秒的平均时间

我的论坛上有更多的细节和bencmark信息

大卫:伟大的方向,但你错过了\ r。 这对我工作:

 $array = preg_split("/(\r\n|\n|\r)/", $string); 

你不需要preg_ *函数,也不需要preg模式,也不需要str_replace等等,以便通过换行符将string拆分成数组。 在所有情况下,无论是Linux / Mac还是m $,都可以。

 <?php $array = explode(PHP_EOL, $string); // ... $string = implode(PHP_EOL, $array); ?> 

PHP_EOL是一个持有服务器平台使用的换行符的常量。

 explode("\n", $str); 

“(而不是”)是相当重要的,否则,换行符将不会被解释。

 <anti-answer> 

正如其他答案已经指定,一定要使用explode而不是split因为从PHP 5.3.0 split已被弃用。 即以下是不是你想要做的方式:

 $your_array = split(chr(10), $your_string); 

LF =“\ n”= chr(10),CR =“\ r”= chr(13)

 </anti-answer> 

StackOverflow不会允许我评论hesselbom的答案(没有足够的声望),所以我join我自己的…

 $array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY); 

这对我最好,因为它也自动消除了前导(第二个\ s *)和尾随(第一个* s)空白,并跳过了空行(PREG_SPLIT_NO_EMPTY标志)。

– =选项= –

如果你想保持领先的空白,简单地摆脱第二个\ s *并使其成为一个rtrim(),而不是…

 $array = preg_split('/\s*\R/', rtrim($text), NULL, PREG_SPLIT_NO_EMPTY); 

如果你需要保持空行,摆脱NULL(它只是一个占位符)和PREG_SPLIT_NO_EMPTY标志,像这样…

 $array = preg_split('/\s*\R\s*/', trim($text)); 

或保持领先的空白和空行…

 $array = preg_split('/\s*\R/', rtrim($text)); 

我没有看到你为什么要保留空白的任何理由,所以我build议把第一个*放在那里。 但是,如果所有你想要的是按照新的路线(如标题所示)分开,这是简单的(正如Jan Goyvaerts所提到的)…

 $array = preg_split('/\R/', $text); 

对于任何人试图在crontab中显示cronjob,并且对如何分隔每一行感到沮丧,请使用explode:

 $output = shell_exec('crontab -l'); $cron_array = explode(chr(10),$output); 

使用'\ n'似乎不起作用,但是chr(10)很好地工作:D

希望这节省了一些一些头痛。

你可以使用这个:

  \str_getcsv($str,PHP_EOL); 

你可以做一个$ string = nl2br($ string),这样你的换行符就变成了

 <br />. 

这样,系统使用\ r \ n或\ n或\ r并不重要

然后,你可以将其馈入一个数组中:

 $array = explode("<br />", $string); 
 $str = "My text1\nMy text2\nMy text3"; $arr = explode("\n", $str); foreach ($arr as $line_num => $line) {    echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n"; } 

真数组:

 $str = "My text1\nMy text2\nMy text3"; $arr = explode("\n", $str); $array = array(); // inisiasi variable array in format array foreach ($arr as $line) { // loop line by line and convert into array $array[] = $line; }; print_r($array); // display all value echo $array[1]; // diplay index 1 

在线embedded:

 body, html, iframe { width: 100% ; height: 100% ; overflow: hidden ; } 
 <iframe src="https://ideone.com/vE1gst" ></iframe> 

这个方法总是适用于我:

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

在使用PHP爆炸的string或换行符之间使用任何特殊字符我们可以实现这一点。