我的数据库中有一个包含换行符的字符串。我想将该字符串转换为数组,并且对于每个新行,跳转数组中的一个索引位置。
如果字符串是:
我的文字1 我的文字2 我的文字3
我想要的结果是:
Array
(
[0] => My text1
[1] => My text2
[2] => My text3
)
答案 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_replace
和explode
。
$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)
$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
之间的任何特殊字符,我们可以实现此目的。