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)
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上的换行符!
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实际上将其解释为换行符.
(有关详细信息,请参阅该手册页)
voi*_*ate 34
PHP已经知道当前系统的换行符.只需使用EOL常量.
explode(PHP_EOL,$string)
Run Code Online (Sandbox Code Playgroud)
Ree*_*eed 27
戴维斯回答更快(更快)的替代方法是使用str_replace和explode.
$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信息
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是一个常量,包含服务器平台使用的换行符.
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函数标志将在单个简洁的函数调用中提供无间隙的索引数组。有些人对正则表达式有偏见,但这是为什么应该使用正则表达式的完美案例。如果出于合理的原因需要考虑性能(例如,您正在处理数十万个数据点),那么请继续投资基准测试和微优化。除此之外,只需使用这一行代码即可使您的代码简洁、健壮且直接。
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)
<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)
| 归档时间: |
|
| 查看次数: |
324561 次 |
| 最近记录: |