256

我的数据库中有一个带换行符的字符串。我想将该字符串转换为一个数组,并且对于每一新行,在数组中跳转一个索引位置。

如果字符串是:

My text1
My text2
My text3

我想要的结果是这样的:

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

19 回答 19

401

我一直使用它并取得了巨大的成功:

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

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

于 2012-06-22T23:17:31.553 回答
322

您可以使用该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)


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

于 2009-09-27T12:31:37.220 回答
289

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

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

所以对于你的问题:

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

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

于 2011-09-21T11:22:40.750 回答
38

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

explode(PHP_EOL,$string)
于 2012-09-07T12:32:44.397 回答
36

更快(更快)的戴维斯答案的替代方法是使用str_replaceand explode

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

发生的事情是:
由于换行符可以以不同的形式出现,我str_replace\r\n、\n\r 和 \r 用 \n 代替(并且原始 \n 被保留)。
然后爆炸\n,你有一个数组中的所有行。

我在此页面的 src 上做了一个基准测试,并在 for 循环中将行拆分 1000 次,并且:
preg_replace平均耗时 11 秒
str_replace & explode平均耗时约 1 秒

我的论坛上的更多详细信息和基准信息

于 2015-02-25T17:35:26.477 回答
21

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

$array = preg_split("/(\r\n|\n|\r)/", $string);
于 2012-07-10T13:05:32.527 回答
12

您不需要 preg_* 函数、preg模式、str_replace inside等,就可以通过换行符成功地将字符串分解为数组。在所有情况下,无论是 Linux、Mac 还是 Windows,都可以。

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

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

于 2016-03-09T22:32:59.883 回答
11

使用:$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));

我看不出您有任何理由要保留尾随空格,因此我建议将第一个 \s* 留在那里。但是,如果你想要的只是换行(如标题所示),它就是这么简单(如Jan Goyvaerts 所述)......

$array = preg_split('/\R/', $text);
于 2016-08-19T17:33:20.957 回答
9
explode("\n", $str);

" (而不是 ') 非常重要,否则将不会解释换行符。

于 2009-09-27T12:31:42.570 回答
8

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

PHP 转义序列\R文档:https ://www.php.net/manual/en/regexp.reference.escape.php#:~:text=line%20break,\r\n

代码:(演示

$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函数标志将在一个简洁的函数调用中提供一个无间隙的索引数组。有些人对正则表达式有偏见,但这是为什么应该使用正则表达式的完美案例。如果出于正当理由(例如,您正在处理数十万个数据点)而担心性能,那么请继续投资于基准测试和微优化。除此之外,只需使用这一行代码,您的代码就可以简洁、健壮和直接。

于 2020-12-20T21:14:38.597 回答
7
<anti-answer>

正如其他答案所指定的那样,请务必使用explode而不是split因为 PHP 5.3.0split已被弃用。即以下不是您想要的方式:

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

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

</anti-answer>
于 2009-11-17T12:41:56.447 回答
3

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

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

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

希望这可以避免一些人头疼。

于 2011-07-13T06:36:23.877 回答
3

你可以使用这个:

 \str_getcsv($str, PHP_EOL);
于 2013-07-01T11:00:28.470 回答
3

这是我的风格:

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

这也将跳过所有空行。

于 2019-08-19T06:33:01.980 回答
2

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

<br />. 

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

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

$array = explode("<br />", $string);
于 2014-06-13T00:02:55.767 回答
2

采用:

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

于 2017-06-21T21:24:34.003 回答
0

仅使用“基础”包也是简单情况的解决方案:

> 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)
于 2018-01-02T17:50:12.910 回答
0

我在 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);
?>
于 2018-06-29T07:44:56.650 回答
-1

这种方法总是对我有用:

$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'])));
于 2013-10-19T03:09:33.480 回答