如何将字符串放入数组中,用新行拆分?

时间:2009-09-27 12:27:30

标签: php string line-breaks

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

如果字符串是:

  

我的文字1   我的文字2   我的文字3

我想要的结果是:

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

20 个答案:

答案 0 :(得分:283)

我一直都非常成功地使用它:

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

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

答案 1 :(得分:274)

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

使用RegExp拆分字符串,您可以使用\ R

匹配所有三个字符串

所以对你的问题:

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

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

答案 2 :(得分:252)

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


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

答案 3 :(得分:33)

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

explode(PHP_EOL,$string)

答案 4 :(得分:27)

更快(更快)的Davids answer替代方法是使用str_replaceexplode

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

发生了什么:
由于换行符可以有不同的形式,我str_replace \ r \ n,\ n \ r和\ r \ n而不是\ n(和原始\ n保存)。
然后在\n上爆炸,你就拥有了数组中的所有行。

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

有关my forum

的详细信息和bencmark信息

答案 5 :(得分:19)

大卫:很棒的方向,但你错过了\ r。这对我有用:

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

答案 6 :(得分:9)

explode("\n", $str);

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

答案 7 :(得分:9)

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

<?php 

 $array = explode(PHP_EOL, $string);
 // ...  
 $string = implode(PHP_EOL, $array);

?>
  

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

答案 8 :(得分:7)

<anti-answer>

正如其他答案所指定的那样,请务必使用explode而不是split,因为自PHP 5.3.0 split起,不推荐使用$your_array = split(chr(10), $your_string); 。即以下 NOT 您想要的方式:

</anti-answer>

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

{{1}}

答案 9 :(得分:7)

StackOverflow不允许我评论hesselbom的答案(声誉不够),所以我正在添加自己的...

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

这对我来说效果最好,因为它还会自动消除前导(秒\ s *)和尾随(第一个\ s *)空格,并且还会跳过空白行(PREG_SPLIT_NO_EMPTY标志)。

- = OPTIONS = -

如果你想保持领先的空白,只需摆脱第二个\ 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);

答案 10 :(得分:3)

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

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

使用'\ n'似乎没有用,但chr(10)效果很好:D

希望这可以节省一些令人头疼的问题。

答案 11 :(得分:2)

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

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

代码:(Demo)

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

答案 12 :(得分:2)

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

<br />. 

这样,系统使用\ r \ n或\ n或\ r

无关紧要

然后你可以把它喂成一个数组:

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

答案 13 :(得分:2)

你可以用这个:

 \str_getcsv($str,PHP_EOL);

答案 14 :(得分:1)

$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";
}

true array:

$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

嵌入在线:

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

答案 15 :(得分:1)

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

答案 16 :(得分:1)

那是我的方式:

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

这也将跳过所有空行。

答案 17 :(得分:0)

此方法始终适用于我:

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

答案 18 :(得分:0)

仅使用&#39; base&#39;包也是一个简单案例的解决方案:

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

答案 19 :(得分:-4)

使用PHP爆炸使用字符串或换行符\n之间的任何特殊字符,我们可以实现此目的。