如何把string放在数组中,按新行分割?
我的数据库中有换行符的string。 我想将该string转换为一个数组,并为每一个新行,跳转数组中的一个索引位置。
如果string是:
我的文字1
我的text2
我的文字3
我想要的结果是这样的:
Array ( [0] => My text1 [1] => My text2 [2] => My text3 )
您可以使用explode
function,使用“ \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_replace
和explode
。
$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或换行符之间使用任何特殊字符我们可以实现这一点。