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

Joh*_*han 199 php string line-breaks

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

如果字符串是:

我的text1
我的文本2
我的文字3

我想要的结果是:

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 301

我一直用这个非常成功:

$array = preg_split("/\r\n|\n|\r/", $string);
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案应该是顶部而不是Pascal的.那个在所有情况下都不起作用. (11认同)
  • `\ R` [匹配](http://php.net/manual/en/regexp.reference.escape.php)`\n`,`\ r``和`\ r \n` (2认同)
  • 或者更短的`/\r?\n/` (2认同)

hes*_*bom 276

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

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

那么对于你的问题:

$array = preg_split ('/$\R?^/m', $string);
Run Code Online (Sandbox Code Playgroud)

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

  • 只需使用`$ array = preg_split('/\R /',$ string);` (32认同)
  • 有时不工作!`preg_split("/\r \n | \n |\r /",$ string)`更好的选择 (17认同)
  • 我也使用了这个,而不是在这个帖子上接受的答案和任何其他答案.只是留下这个评论作为信息. (3认同)
  • 实际上,这对我不起作用.有时候换行符仍存在于数组键中. (3认同)
  • 相关:[如何用最聪明的方式替换PHP中不同的换行样式?](http://stackoverflow.com/q/7836632/367456) (2认同)
  • 我是第二个'莫里斯'说的,不适合我.'Jan'给出的解决方案虽然有效,但...... (2认同)

Pas*_*TIN 268

您可以使用该explode功能,使用" \n"作为分隔符:

$your_array = explode("\n", $your_string_from_db);
Run Code Online (Sandbox Code Playgroud)

例如,如果你有这段代码:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);
var_dump($arr);
Run Code Online (Sandbox Code Playgroud)

你会得到这个输出:

array
  0 => string 'My text1' (length=8)
  1 => string 'My text2' (length=8)
  2 => string 'My text3' (length=8)
Run Code Online (Sandbox Code Playgroud)


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

  • 而不是`\n`你可以使用预定义的常量`PHP_EOL`. (49认同)
  • 每个人都要小心这个解决方案,因为它不适用于所有新行.大卫的回答让我获得了最大的成功 (39认同)
  • 没有这个答案,对这个答案的评论是错误的!因为这不会影响操作系统换行符,尤其不是`PHP_EOL`.你必须使用`preg_split("/ \\ r \\n | \\ r | \\n /",$ value)`. (6认同)
  • 您必须在 \n 或 \r 处进行分割才能处理所有类型的文本 - 这仅适用于 Linux 和 Windows 换行符。Mac 换行符将被忽略!(\r) (2认同)

voi*_*ate 34

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

explode(PHP_EOL,$string)
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是可以编辑文件,或者在本例中,Windows中的数据库条目然后在Linux系统上使用它,例如.我认为一般方法更适合. (16认同)
  • 我不确定这是否正确。如果提交网页上的文本区域,则它可能具有不同的行尾字符,具体取决于用户的浏览器,而不是服务器的操作系统。因此,无论您使用什么操作系统,您都需要能够解析任何内容。当然,这是假设您正在做网络工作。 (2认同)

Ree*_*eed 27

戴维斯回答更快(更快)的替代方法是使用str_replaceexplode.

$arrayOfLines = explode("\n",
                    str_replace(array("\r\n","\n\r","\r"),"\n",$str)
            );
Run Code Online (Sandbox Code Playgroud)

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

我在这个页面的src上做了一个基准测试,然后在一个for循环中将这些行拆分了1000次,并且
preg_replace采取了平均11秒
str_replace & explode的平均值.

我的论坛上有更多细节和bencmark信息

  • 据我所知,您只需要在搜索数组中保留 `\r\n` (就此而言,它不再需要是一个数组)。我对“preg_”慢 11 倍的说法很感兴趣。您没有包含您使用的模式。上面的代码片段对输入进行了 4 次传递。一种好的“preg_”技术将只对输入进行一次传递。正则表达式并不以其速度而闻名,但我认为你的说法需要证实。如果您打算在答案中保留此性能声明,请发布您的基准详细信息。 (2认同)

Lob*_*Man 19

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

$array = preg_split("/(\r\n|\n|\r)/", $string);
Run Code Online (Sandbox Code Playgroud)


Spo*_*oky 11

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

<?php 

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

?>
Run Code Online (Sandbox Code Playgroud)

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

  • 该文件可能来自另一个具有不同新行的系统,特别是在网络环境中使用PHP (3认同)

mic*_*usa 11

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

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)
);
Run Code Online (Sandbox Code Playgroud)

输出:

array (
  0 => 'My text1',
  1 => 'My text2',
  2 => 'My text3',
)
Run Code Online (Sandbox Code Playgroud)

OP 没有提到从行中修剪水平空白字符,因此不需要删除\s\h同时在变量(与系统无关)新行上爆炸。

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

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

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


Dam*_*IEU 9

explode("\n", $str);
Run Code Online (Sandbox Code Playgroud)

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


Dee*_*oxx 8

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

$array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY);
Run Code Online (Sandbox Code Playgroud)

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

- = OPTIONS = -

如果你想保持领先的空白,只需摆脱第二个\ s*并使其成为rtrim()而不是......

$array = preg_split('/\s*\R/', rtrim($text), NULL, PREG_SPLIT_NO_EMPTY);
Run Code Online (Sandbox Code Playgroud)

如果你需要保留空行,摆脱NULL(它只是一个占位符)和PREG_SPLIT_NO_EMPTY标志,就像这样......

$array = preg_split('/\s*\R\s*/', trim($text));
Run Code Online (Sandbox Code Playgroud)

或保持领先的空白和空行......

$array = preg_split('/\s*\R/', rtrim($text));
Run Code Online (Sandbox Code Playgroud)

我没有看到你为什么要保留尾随空格的任何理由,所以我建议将第一个\ s*留在那里.但是,如果您想要的只是按新线划分(如标题所示),那就很简单(正如Jan Goyvaerts所提到的)......

$array = preg_split('/\R/', $text);
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 7

<anti-answer>
Run Code Online (Sandbox Code Playgroud)

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

$your_array = split(chr(10), $your_string);
Run Code Online (Sandbox Code Playgroud)

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

</anti-answer>
Run Code Online (Sandbox Code Playgroud)