如果字符串为:
My text1
My text2
My text3
我想要的结果是这样的:
Array
(
[0] => My text1
[1] => My text2
[2] => My text3
)
My text1
My text2
My text3
我想要的结果是这样的:
Array
(
[0] => My text1
[1] => My text2
[2] => My text3
)
我一直非常成功地使用了这个:
$array = preg_split("/\r\n|\n|\r/", $string);
(已更新为包含最终\r,感谢@LobsterMan)
/\r?\n/
- Jason Schillingexplode
函数,以"\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
实际上被解释为换行符。 (请参阅该手册页面了解更多详细信息。)PHP_EOL
替代 \n
。 - TimPHP_EOL
。你必须使用 preg_split("/\\r\\n|\\r|\\n/", $value)
。 - kjdion84不同平台上,换行符的定义不同,有\r\n、\r或\n。
使用RegExp来拆分字符串,你可以用\R匹配所有三个换行符。
所以对于你的问题:
$array = preg_split ('/$\R?^/m', $string);
这将匹配Windows、Mac和Linux上的换行符!
$array = preg_split ('/\R/', $string);
进行分割。 - Jan Goyvaertspreg_split("/\r\n|\n|\r/", $string)
是更好的选择。 - Alexey B.PHP已经知道当前系统的换行符。只需使用EOL常量。
explode(PHP_EOL,$string)
trim()
函数来删除任何多余的空格。 - Timstr_replace
和explode
。$arrayOfLines = explode("\n",
str_replace("\r\n","\n",$str)
);
str_replace
将\r\n、\n\r和\r替换为\n(同时保留原始的\n)。\n
上进行分割,你就得到了一个包含所有行的数组。
我对这个页面的源代码进行了1000次循环的行分割的基准测试:
preg_replace
的平均时间为11秒
str_replace & explode
的平均时间约为1秒
有关我的论坛的更多详细信息和基准测试信息
\n\r
? - mickmackusa\n\r
? - Reed\r\n
(而且它不再需要是一个数组)。我对“preg_”比其他方法慢11倍的说法很感兴趣。您没有包含您使用的模式。您上面的代码片段对输入进行了4次遍历。一个好的“preg_”技巧只需要对输入进行一次遍历。正则表达式并不以其速度著称,但我认为您的说法需要证实。如果您要保留这个性能声明,请发布您的基准测试详细信息。 - mickmackusaDavid的方向很好,但它错过了 \r。以下方法适用于我:
$array = preg_split("/(\r\n|\n|\r)/", $string);
想要成功地将字符串按换行符分割成数组,不需要使用 preg_* 函数,preg 模式,str_replace 等。在所有情况下,无论是 Linux、Mac 还是 Windows,以下代码都可以实现。
<?php
$array = explode(PHP_EOL, $string);
// ...
$string = implode(PHP_EOL, $array);
?>
PHP_EOL是一个常量,保存着服务器平台使用的换行符。
使用方法: $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);
$array = preg_split('/\s*\R\s*/', trim($text));
或者保留前导空白和空行...
$array = preg_split('/\s*\R/', rtrim($text));
我认为没有什么理由需要保留行末的空格,所以建议保留第一个\s*。但是,如果你只想按换行符分割(如标题所示),那么它就非常简单(如Jan Goyvaerts提到的)...
$array = preg_split('/\R/', $text);
这个页面上有直接和间接回答的混合,并且一些评论中有很好的建议,但没有一个答案能代表我在自己的项目中所写的内容。
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
函数标志将在单个简洁的函数调用中提供无间隙的索引数组。一些人对正则表达式有偏见,但这是为什么应该使用正则表达式的完美案例。如果出于有效原因(例如,您正在处理数十万个数据点),性能是一个问题,请继续投资于基准测试和微优化。除此之外,只需使用这一行代码,以使您的代码简洁、强大且直接。
explode("\n", $str);