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


220

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

如果字符串是:

My text1
My text2
My text3

我想要的结果是这样的:

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

1
我不知道PHP,但是通常有一个称为“ split”的字符串函数。它的工作方式如下:array = split(string,“ \ n”)
Sedat Kapanoglu 09年

您可能应该首先对换行进行规范化。该方法s($yourString)->normalizeLineEndings()可在github.com/delight-im/PHP-Str(MIT许可下的库)中使用,该库还有许多其他有用的字符串帮助器。您可能需要看一下源代码。
2016年

Answers:


290

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


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


52
而是\n可以使用预定义常量PHP_EOL
蒂姆(Tim)

40
每个人都请谨慎使用此解决方案,因为它不适用于所有换行符。我在戴维(David)的回答中获得了最大的成功
莫里斯(Maurice)

1
您必须在\ n或\ r处分开才能处理所有类型的文本-这仅适用于linux&Windows换行符。Mac换行符将被忽略!(\ r)
史蒂夫·霍瓦斯

1
我猜Tims的答案/注释不正确,因为这只会与您的系统的换行符匹配,但是当您从其他系统获取具有换行符的字符串时,它将无法正常工作!电子邮件存在此问题
Asara

7
不,这个答案,这个答案的评论是错误的!因此,这不会影响OS换行符,尤其是PHP_EOL。您必须使用preg_split("/\\r\\n|\\r|\\n/", $value)
kjdion84

330

我一直很成功地使用它:

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

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


11
这个答案应该在顶部而不是Pascal的顶部。那不是在所有情况下都起作用。
Jithesh Kt 2014年

1
这就是答案。经验证的是错误的。嗯,hesselbom也有它...您也可以使用以下等效项:preg_split('/ \ n | \ r /',$ string,-1,PREG_SPLIT_NO_EMPTY); 为了美丽:)为什么这是唯一的好答案?因为您无法假定将获得哪种类型的行尾:Mac(\ r),Windows(\ r \ n)或Unix(\ n)。
Ninj 2015年

2
\R 比赛 \n\r以及\r\n
mpen

1
或更短/\r?\n/
Jason Schilling

此示例是正确的,因为您不能仅执行仅基于单个字符的任何拆分操作。如果这样做,在“ \ r”或“ \ n”上触发时,如果Windows“ \ r \ n”结尾,则会以多余的空行结尾。首先测试两个字符的Windows分隔符很重要。
AndresRohrAtlasInformatik

281

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

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

因此,对于您的问题:

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

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


3
我也用了这个,而不是在这个线程上接受的答案和任何其他答案。只是将此评论留作参考。
塞斯·马拉基

3
实际上,这对我不起作用。有时换行符仍然存在于数组键中。
莫里斯


32
只需使用$array = preg_split ('/\R/', $string);
Jan Goyvaerts

18
有时不工作!preg_split("/\r\n|\n|\r/", $string)更好的选择
Alexey B.

34

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

explode(PHP_EOL,$string)

18
是的,但是可以编辑一个文件,或者在本示例中,例如在Windows中编辑db条目,然后在Linux系统上使用它。我认为一般方法会更好。
Cranio

我不确定这是对的。如果提交了网页上的文本区域,则它可能具有不同的行尾字符,具体取决于用户的浏览器,而不是服务器的操作系统。因此,无论您使用什么操作系统,都将需要能够解析任何内容。当然,这是假设您正在做网络工作。
Magmatic

然后,您可能必须使用trim()结果字符串来删除任何多余的空格。
蒂姆(Tim)

30

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

$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平均
str_replace & explode花费11秒,平均花费约1秒

我的论坛上有更多详细信息和本马克信息


您的论坛链接(以及整个域)似乎都关闭了
Nikita

19

大卫:方向很好,但您错过了\ r。这为我工作:

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

11

您不需要preg_ *函数,preg模式或内部的str_replace等..即可成功地用换行符将字符串拆分成数组。在所有情况下,无论是Linux / Mac还是m $,都可以。

<?php 

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

?>

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


3
该文件可能来自具有不同换行符的另一个系统,特别在网络环境中使用PHP
LucaC。Luca C.

这正是该常量存在并处理该特定问题的原因。
诡异的

如果您从Windows获取文件,则该文件与来自UNIX或Mac的文件不匹配,对吗?
卡C.

如果您始终一直在使用纯utf-8,通常到处都包含utf8文件,并且您除了在PHP代码中使用PHP_EOL进行换行检测外,别无选择,它将按说明进行匹配,并且不会发生意外行为。请记住,这不仅是我大喊大叫并要求保护。PHP_EOL的可用性已得到确认。
诡异的

1
在您的情况下,如果源来自其他地方并且格式不佳,那么使用str_replace(比regexp更快)可能会更好。...总而言之,就是regexp。或str_replace或PHP_EOL,有一句很好的老话说:“如果有效,请不要触摸它!”。:)
诡异的


9

StackOverflow不允许我对hesselbom的答案发表评论(信誉欠佳),所以我要添加自己的答案...

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

m修改是不是真的需要呢?那不仅仅影响^$吗?
mpen

@mpen是的,我相信你是正确的。我随身携带了hesselbom的版本。我将编辑我的帖子。
Deen Foxx

7
<anti-answer>

如已指定其他答案,请确保使用explode而不是split因为自PHP 5.3.0起split已弃用。即以下不是您想要的方式:

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

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

</anti-answer>

3

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

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

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

希望这可以节省一些麻烦。


杰夫,您好,欢迎来到。您应该将其重写为一个问题和答案,而不是对其他人的问题的答案。这是一个问答网站,而不是一般论坛。看看常见问题-stackoverflow.com/faq
丽贝卡·斯科特

使用'\n'不起作用,因为转义序列不能用单引号引起来,您需要使用双引号代替:"\n"而不是'n'Read php.net/manual/en/language.types.string.php
Christopher K.

2

您可以使用此:

 \str_getcsv($str,PHP_EOL);

2

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

<br />. 

这样,系统使用\ r \ n还是\ n或\ r都没关系

然后,您可以将其输入数组:

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

注意:nl2br不会替换换行符...它仅在每个换行符之前插入一个break标签。因此,除第一个数组项外,所有其他数组项都将以换行符开头。如果那对您来说无关紧要,则此方法是最快的。如果确实如此,Jakar的答案将是最快的。
2015年

2

这是我的风格:

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

这也将跳过所有空行。


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

真实数组:

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


与答案添加一些解释如何回答帮助OP在固定电流问题
ρяσѕρєяķ

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

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

1
喜欢将咒骂作为代码的一部分。:)无论如何,用\ n替换既简单又安全(请参阅其他答案)。
Stefan Reich 2015年

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)

-6

使用\nPHP爆炸在字符串或换行符之间使用任何特殊字符都可以实现此目的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.