按新行字符拆分字符串

我有一个新的行字符字符串。我想把这个字符串转换成一个数组,对于每一个新行,在数组中跳转一个索引位置。

如果字符串是:

My text1
My text2
My text3

我想要的结果是:

Array
(
[0] => My text1
[1] => My text2
[2] => My text3
)
427437 次浏览

你可以使用explode函数,使用“\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)
< p >
注意,你必须使用双引号字符串,所以\n实际上被解释为换行符。 < / p >
(详情请参阅手册页。)
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>

对于任何试图在crontab中显示cronjob并且不知道如何分隔每行的人,请使用爆炸:

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

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

希望这能让一些人少头疼。

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

使用RegExp分割字符串,您可以用\R匹配所有三个字符串

对于你的问题:

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

这将与Windows, Mac和Linux上的换行符匹配!

我一直都很成功地使用这个方法:

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

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

大卫有一个伟大的方向,但它错过了\r。这招对我很管用:

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

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

explode(PHP_EOL,$string)

你可以用这个:

 \str_getcsv($str, PHP_EOL);

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

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

您可以执行$string = nl2br($string),以便将换行符更改为

<br />.

这样,系统使用\r\n或\n或\r就无关紧要了

然后你可以把它输入一个数组:

$array = explode("<br />", $string);

大卫回答的另一个更快(快得多)的替代方法是使用str_replaceexplode

$arrayOfLines = explode("\n",
str_replace(["\r\n","\n\r","\r"],"\n",$str)
);
发生的事情是:
由于换行符可以有不同的形式,所以我str_replace \r\n, \n\r,和用\n代替的\r(和原来的\n被保留) 然后在\n上爆炸,你就有了一个数组中的所有行 我在本页的src上做了一个基准测试,并在for循环中将行分割1000次,并:
preg_replace平均花费11秒
str_replace & explode花费了平均约1秒

更多的细节和基准信息在my forum .

你不需要怀孕函数,怀孕的模式,str_replace within等,以成功地将一个字符串通过换行符分割成数组。在所有场景中,无论是Linux、Mac还是Windows,这都可以。

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

PHP_EOL是一个常量,保存服务器平台使用的换行符。

< p >使用: $数组= preg_split (' / \ s * \ R \ s * /”,削减(文本)美元,NULL, PREG_SPLIT_NO_EMPTY); < / p >

这对我来说效果最好,因为它还自动消除了前导(第二个\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));

我看不出有什么理由你会想要保留后面的空格,所以我建议把第一个\s*留在那里。但是,如果你想要的只是用换行符分割(如标题所示),它是简单的(如Jan Goyvaerts提到的)…

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

使用:

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


foreach ($arr as $line) { // loop line by line and convert into array
$array[] = $line;
};


print_r($array); // display all value


echo $array[1]; // display index 1

嵌入在线:

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

只使用'base'包也是简单情况下的解决方案:

> s <- "a\nb\rc\r\nd"
> l <- strsplit(s,"\r\n|\n|\r")
> l  # the whole list...
[[1]]
[1] "a" "b" "c" "d"
> l[[1]][1] # ... or individual elements
[1] "a"
> l[[1]][2]
[1] "b"
> fun <- function(x) c('Line content:', x) # handle as you wish
> lapply(unlist(l), fun)

我在PHP文档中找到了这个:

<?php
// Split the phrase by any number of commas or space characters,
// which include " ", \r, \t, \n and \f


$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords);
?>

这就是我的方式:

$lines = preg_split('/[\r\n]+/', $db_text, NULL, PREG_SPLIT_NO_EMPTY);

这也将跳过所有空行。

这个页面上有很多直接或间接的答案,评论中也有一些很好的建议,但没有一个答案能代表我在自己的项目中所写的内容。

PHP转义序列\R文档

代码(演示):

$string = '
My text1


My text2




My text3




';


var_export(
preg_split('/\R+/', $string, 0, PREG_SPLIT_NO_EMPTY)
);

输出:

array (
0 => 'My text1',
1 => 'My text2',
2 => 'My text3',
)

OP没有提到从行中删除水平空白字符,因此不期望在变量(系统不可知)新行上爆炸时删除\s\h

虽然PHP_EOL是明智的建议,但当换行序列来自另一个操作系统时,它缺乏适当地爆炸字符串的灵活性。

使用非正则表达式爆炸往往不太直接,因为它需要字符串准备。此外,如果有多余的空白线需要清除,爆炸后可能会有清理工作。

使用\R+(一个或多个连续换行序列)和PREG_SPLIT_NO_EMPTY函数标志将在一个简单的函数调用中交付一个无间隙的索引数组。有些人对正则表达式有偏见,但这是为什么应该使用正则表达式的一个完美案例。如果出于合理的原因考虑性能问题(例如,您正在处理数十万个数据点),那么就继续投资于基准测试和微观优化。除此之外,只需使用这一行代码,以便您的代码简短、健壮和直接。