Làm thế nào tôi có thể đặt các chuỗi trong một mảng, được phân chia bởi dòng mới?


220

Tôi có một chuỗi với ngắt dòng trong cơ sở dữ liệu của tôi. Tôi muốn chuyển đổi chuỗi đó thành một mảng và với mỗi dòng mới, hãy nhảy một vị trí chỉ mục trong mảng.

Nếu chuỗi là:

My text1
My text2
My text3

Kết quả tôi muốn là thế này:

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

1
Tôi không biết PHP nhưng thường có một hàm gọi là "split" cho chuỗi. Nó hoạt động như thế này: mảng = split (chuỗi, "\ n")
Sedat Kapanoglu

Bạn nên bình thường hóa các dòng mới trước, có lẽ. Phương pháp s($yourString)->normalizeLineEndings()này có sẵn với github.com/delight-im/PHP-Str (thư viện theo Giấy phép MIT) có rất nhiều trình trợ giúp chuỗi hữu ích khác. Bạn có thể muốn xem mã nguồn.
caw

Câu trả lời:


290

Bạn có thể sử dụng explodechức năng, sử dụng " \n" làm dấu phân cách:

$your_array = explode("\n", $your_string_from_db);

Chẳng hạn, nếu bạn có đoạn mã này:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);
var_dump($arr);

Bạn sẽ nhận được kết quả này:

array
  0 => string 'My text1' (length=8)
  1 => string 'My text2' (length=8)
  2 => string 'My text3' (length=8)


Lưu ý rằng bạn phải sử dụng một chuỗi trích dẫn kép , vì vậy \nthực sự được hiểu là ngắt dòng.
(Xem trang hướng dẫn đó để biết thêm chi tiết.)


52
Thay vì \nbạn có thể sử dụng hằng số được xác định trước PHP_EOL.
Tim

40
Mọi người hãy cẩn thận với giải pháp này, vì nó không hoạt động trên tất cả các dòng mới. Tôi đã thành công nhất với câu trả lời của David
Maurice

1
Bạn phải phân chia ở một trong hai \ n hoặc \ r để có thể xử lý tất cả các loại văn bản - điều này sẽ chỉ hoạt động với các dòng mới của linux & windows. Mac dòng mới sẽ bị coi thường! (\ r)
Steve Horvath

1
Tôi đoán câu trả lời / nhận xét của Tims là không đúng, bởi vì điều này sẽ chỉ phù hợp với việc ngắt dòng hệ thống CỦA BẠN, nhưng khi bạn nhận được chuỗi có ngắt dòng từ các hệ thống khác thì nó sẽ không hoạt động! Có vấn đề với email
Asara

7
Không có câu trả lời này và các ý kiến ​​về câu trả lời này là SAI! Bởi vì điều này không phải là yếu tố trong nhân vật dòng mới của hệ điều hành, đặc biệt là không PHP_EOL. Bạn phải sử dụng preg_split("/\\r\\n|\\r|\\n/", $value).
kjdion84

330

Tôi đã luôn sử dụng điều này rất thành công:

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

(được cập nhật với \ r cuối cùng, cảm ơn @LobsterMan)


11
Câu trả lời này phải ở trên đầu thay vì của Pascal. Điều đó đã không làm việc trên tất cả các trường hợp.!
Jithesh Kt

1
Đây là câu trả lời. Một trong những xác nhận là SAI. Chà, hecraftbom cũng có nó ... Bạn cũng có thể sử dụng tương đương này: preg_split ('/ \ n | \ r /', $ string, -1, PREGinksLIT_NO_EMPTY); vì lợi ích của cái đẹp :) Tại sao đây là câu trả lời tốt duy nhất? Bởi vì bạn không thể giả sử loại kết thúc của dòng bạn sẽ nhận được: Mac (\ r), Windows (\ r \ n) hoặc Unix (\ n).
Ninj

2
\R trận đấu \n , \r\r\n
mpen

1
Hoặc ngắn hơn/\r?\n/
Jason Schilling

Ví dụ này là chính xác vì bạn không thể thực hiện bất kỳ thao tác phân tách nào chỉ dựa trên một ký tự. Nếu bạn làm điều đó, kích hoạt vào '\ r' hoặc '\ n', bạn sẽ kết thúc bằng một dòng trống thừa trong trường hợp kết thúc "\ r \ n" của Windows. Và điều quan trọng là trình phân tách Windows hai ký tự được thử nghiệm đầu tiên.
AndresRohrAtlasInformatik

281

Ngắt dòng được xác định khác nhau trên các nền tảng khác nhau, \ r \ n, \ r hoặc \ n.

Sử dụng RegExp để phân tách chuỗi, bạn có thể khớp cả ba với \ R

Vì vậy, đối với vấn đề của bạn:

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

Điều đó sẽ phù hợp với ngắt dòng trên Windows, Mac và Linux!


3
Tôi cũng đã sử dụng nó thay vì câu trả lời được chấp nhận và bất kỳ câu trả lời nào khác về chủ đề này. Chỉ cần để lại nhận xét này là một thông tin.
Seth Malaki

3
Trên thực tế, điều này đã không làm việc cho tôi. Đôi khi các dòng mới vẫn hiện diện trong các phím mảng.
Maurice


32
Chỉ cần sử dụng$array = preg_split ('/\R/', $string);
Jan Goyvaerts

18
Đôi khi không làm việc! preg_split("/\r\n|\n|\r/", $string)sự lựa chọn tốt hơn
Alexey B.

34

PHP đã biết (các) ký tự dòng mới của hệ thống hiện tại. Chỉ cần sử dụng hằng số EOL.

explode(PHP_EOL,$string)

18
Có, nhưng người ta có thể chỉnh sửa một tệp hoặc như trong ví dụ này, một mục nhập db trong Windows sau đó sử dụng nó trên hệ thống Linux chẳng hạn. Tôi nghĩ rằng một cách tiếp cận chung sẽ phù hợp hơn.
Cranio

Tôi không chắc điều này đúng. Nếu một vùng văn bản trên trang web được gửi, nó có thể có các ký tự cuối dòng khác nhau tùy thuộc vào trình duyệt của người dùng, không phải hệ điều hành của máy chủ. Vì vậy, bất kể bạn đang sử dụng hệ điều hành nào, bạn sẽ cần có khả năng phân tích cú pháp bất cứ điều gì. Tất nhiên, điều này là giả sử bạn đang làm công cụ web.
Magmatic

Sau đó, bạn có thể phải sử dụng trim()các chuỗi kết quả để loại bỏ bất kỳ khoảng trắng bên ngoài nào.
Tim

30

Một cách khác để trả lời Davids nhanh hơn (cách nhanh hơn) là sử dụng str_replaceexplode.

$arrayOfLines = explode("\n",
                    str_replace(["\r\n","\n\r","\r"],"\n",$str)
            );

Điều gì đang xảy ra là:
Vì ngắt dòng có thể ở các dạng khác nhau, nên tôi sẽ str_replacethay thế \ n \ r và \ r với \ n (và bản gốc \ n được giữ nguyên).
Sau đó phát nổ \nvà bạn có tất cả các dòng trong một mảng.

Tôi đã thực hiện một điểm chuẩn trên src của trang này và chia các dòng 1000 lần trong một vòng lặp for và:
preg_replacemất 11 giây
str_replace & explodemất khoảng 1 giây mất khoảng 1 giây

Thêm chi tiết và thông tin bencmark trên diễn đàn của tôi


Liên kết diễn đàn của bạn (và toàn bộ tên miền) dường như không hoạt động
Nikita 29/07/18

19

David: Hướng tuyệt vời, nhưng bạn đã bỏ lỡ \ r. điều này làm việc cho tôi:

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

11

Bạn không cần các hàm preg_ * cũng như các mẫu preg cũng như str numplace bên trong, v.v. để thành công phá vỡ một chuỗi thành mảng theo dòng mới. Trong tất cả các kịch bản, có thể là Linux / Mac hoặc m $, điều này sẽ làm được.

<?php 

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

?>

PHP_EOL là một hằng số giữ (các) ký tự ngắt dòng được sử dụng bởi nền tảng máy chủ.


3
tệp có thể đến từ một hệ thống khác với các dòng mới khác nhau, đặc biệt là trong môi trường mạng dành cho wich được sử dụng PHP
Luca C.

Đó chính xác là lý do hằng số này tồn tại .. và xử lý vấn đề cụ thể đó.
Ma quái

Nếu bạn lấy một tệp từ windows thì nó không khớp với một tệp từ unix, hoặc mac, phải không?
Luca C.

Nếu bạn đang sử dụng utf-8 thuần mọi lúc, mọi nơi, bao gồm các tệp utf8, thông thường và Bạn không có gì khác ngoài PHP_EOL bên trong mã của bạn để phát hiện ngắt dòng, nó sẽ được khớp như mô tả và sẽ không có hành vi không dự đoán được. Hãy nhớ rằng không chỉ tôi la hét và tuyên bố điều này. Khả năng sử dụng PHP_EOL khá được xác nhận.
Ma quái

1
Trong trường hợp của bạn, nếu các nguồn đến từ một nơi khác và không được hình thành tốt, thì dù sao đi nữa, có thể tốt hơn nếu bạn sử dụng str numplace (nhanh hơn regrec). ... Tất cả trong tất cả, có thể là regrec. hoặc str numplace hoặc PHP_EOL, có một câu cũ hay nói: "Nếu nó hoạt động - đừng chạm vào nó!". :)
Ma quái

9
explode("\n", $str);

"(Thay vì ') khá quan trọng vì nếu không, ngắt dòng sẽ không được giải thích.


9

StackOverflow sẽ không cho phép tôi nhận xét về câu trả lời của hesselbom (không đủ danh tiếng), vì vậy tôi đang thêm ...

$array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY);

Điều này hoạt động tốt nhất đối với tôi vì nó cũng tự động loại bỏ khoảng trắng hàng đầu (giây \ s *) và dấu (đầu tiên \ s *) và bỏ qua các dòng trống (cờ PREGinksLIT_NO_EMPTY).

- = TÙY CHỌN = -

Nếu bạn muốn giữ khoảng trắng hàng đầu, chỉ cần thoát khỏi \ s * thứ hai và biến nó thành rtrim () thay vào đó ...

$array = preg_split('/\s*\R/', rtrim($text), NULL, PREG_SPLIT_NO_EMPTY);

Nếu bạn cần giữ các dòng trống, hãy loại bỏ NULL (nó chỉ là một trình giữ chỗ) và cờ PREGinksLIT_NO_EMPTY, như vậy ...

$array = preg_split('/\s*\R\s*/', trim($text));

Hoặc giữ cả khoảng trắng hàng đầu và dòng trống ...

$array = preg_split('/\s*\R/', rtrim($text));

Tôi không thấy bất kỳ lý do nào khiến bạn muốn giữ khoảng trắng theo dõi, vì vậy tôi khuyên bạn nên để lại \ s * đầu tiên trong đó. Nhưng, nếu tất cả những gì bạn muốn là phân chia theo dòng mới (như tiêu đề gợi ý), thì điều này thật đơn giản (như được đề cập bởi Jan Goyvaerts) ...

$array = preg_split('/\R/', $text);

Công cụ msửa đổi không thực sự cần thiết phải không? Điều đó không chỉ ảnh hưởng ^$?
mở

@mpen Vâng, tôi tin bạn là chính xác. Tôi chỉ mang theo nó cùng với phiên bản của hesselbom. Tôi sẽ chỉnh sửa bài viết của mình.
Deen Foxx

7
<anti-answer>

Như các câu trả lời khác đã chỉ định, hãy chắc chắn sử dụng explodethay splitvì vì phiên bản PHP 5.3.0 splitkhông được dùng nữa. tức là sau đây KHÔNG phải là cách bạn muốn làm:

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

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

</anti-answer>

3

Đối với bất kỳ ai đang cố gắng hiển thị cronjobs trong crontab và cảm thấy thất vọng về cách tách từng dòng, hãy sử dụng explode:

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

sử dụng '\ n' dường như không hoạt động nhưng chr (10) hoạt động độc đáo: D

hy vọng điều này sẽ cứu một số người đau đầu.


Xin chào Jeff, chào mừng bạn đến với SO. Bạn nên viết lại câu hỏi này dưới dạng câu hỏi và câu trả lời, thay vì trả lời câu hỏi của người khác. Đây là một trang web hỏi đáp, không phải là một diễn đàn chung. Hãy xem FAQ - stackoverflow.com/faq
Rebecca Scott

Việc sử dụng '\n'không hiệu quả vì các chuỗi thoát không được diễn giải trong các dấu ngoặc đơn, thay vào đó, bạn cần sử dụng dấu ngoặc kép: "\n"thay vì 'n'Đọc php.net/manual/en/lingu.types.opes.php
Christopher K.


2

Bạn có thể thực hiện $ string = nl2br ($ string) để ngắt dòng của bạn được thay đổi thành

<br />. 

Bằng cách này, không có vấn đề gì nếu hệ thống sử dụng \ r \ n hoặc \ n hoặc \ r

Sau đó, bạn có thể đưa nó vào một mảng:

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

Lưu ý: nl2br không thay thế ngắt dòng ... nó chỉ chèn một thẻ ngắt trước mỗi ngắt dòng. Vì vậy, tất cả các mục mảng của bạn không phải là mục đầu tiên sẽ bắt đầu bằng ngắt dòng. Nếu điều đó không quan trọng với bạn, thì phương pháp này là nhanh nhất. Nếu đó là vấn đề, câu trả lời của Jakar là nhanh nhất.
Áo

2

Đó là cách làm của tôi:

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

Điều này cũng sẽ bỏ qua tất cả các dòng trống quá.


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

mảng thực sự:

$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

Nhúng trực tuyến:

body, html, iframe { 
  width: 100% ;
  height: 100% ;
  overflow: hidden ;
}
<iframe src="https://ideone.com/vE1gst" ></iframe>


Thêm một số giải thích với câu trả lời về cách câu trả lời này giúp OP khắc phục vấn đề hiện tại
ρяσѕρєя K

1

Chọn cái này trong tài liệu 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

Phương pháp này luôn hiệu quả với tôi:

$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
Yêu những lời chửi thề như một phần của mật mã. :) Dù sao, thay thế bằng \ n đơn giản hơn cũng như an toàn hơn (xem các câu trả lời khác).
Stefan Reich

0

Chỉ sử dụng gói 'cơ sở' cũng là một giải pháp cho các trường hợp đơn giản:

> 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

Sử dụng bất kỳ ký tự đặc biệt nào giữa chuỗi hoặc ngắt dòng \nbằng PHP explode, chúng ta có thể đạt được điều này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.