Phát nổ chuỗi PHP theo dòng mới


253

Đơn giản phải không? Chà, điều này không hiệu quả: - \

$skuList = explode('\n\r', $_POST['skuList']);

28
Dấu ngoặc đơn có nghĩa là "không phân tích chuỗi này". Câu trả lời của @ Select0r có lẽ là những gì bạn đang tìm kiếm.
Ryan Kinal

3
có thể trùng lặp làm thế nào để loại bỏ các dòng mới và trả về từ chuỗi php? vốn đã là một bản sao đáng tin cậy loại bỏ các dòng tin tức khỏi chuỗimột số khác . Sử dụng chức năng tìm kiếm frigging trước khi đặt câu hỏi xin vui lòng!
Gordon

1
@Gordon: Ha, tôi đã thấy những gì Đại tá Shrapnel nói trong câu hỏi khác đó. Kinda buồn thật. Thêm phiếu bầu gần của tôi mặc dù.
BoltClock

9
Ngoài các trích dẫn được đưa ra bởi những người khác được đề cập, các cặp CRLF \r\nkhông phải là cách khác.
Powerlord

1
Hãy nhớ rằng: \ R etur \ N
l00k

Câu trả lời:


410

Thực hành tốt nhất

Như đã đề cập trong bình luận cho câu trả lời đầu tiên, cách tốt nhất là sử dụng hằng số PHP_EOL của PHP đại diện cho EOL của hệ thống hiện tại ( End Of Line ).

$skuList = explode(PHP_EOL, $_POST['skuList']);

PHP cung cấp rất nhiều hằng số rất hữu ích khác mà bạn có thể sử dụng để làm cho hệ thống mã của bạn độc lập, xem liên kết này để tìm các hằng thư mục độc lập và hữu ích của hệ thống.

Cảnh báo

Các hằng số này làm cho hệ thống trang của bạn độc lập, nhưng bạn có thể gặp vấn đề khi di chuyển từ hệ thống này sang hệ thống khác khi bạn sử dụng các hằng số với dữ liệu được lưu trữ trên hệ thống khác. Các hằng số của hệ thống mới có thể khác với các hệ thống trước đó và dữ liệu được lưu trữ có thể không hoạt động nữa. Vì vậy, hoàn toàn phân tích dữ liệu của bạn trước khi lưu trữ để loại bỏ bất kỳ phần phụ thuộc hệ thống.

CẬP NHẬT

Nhận xét của Andreas khiến tôi nhận ra rằng giải pháp 'Thực tiễn tốt nhất' mà tôi trình bày ở đây không áp dụng cho trường hợp sử dụng được mô tả: EOL của máy chủ (PHP) không liên quan gì đến EOL mà trình duyệt (mọi hệ điều hành) đang sử dụng, nhưng đó (trình duyệt) là nơi chuỗi đến từ.

Vì vậy, vui lòng sử dụng giải pháp từ @Alin_Purcaru ( ba xuống ) để bao gồm tất cả các cơ sở của bạn (và nêu lên câu trả lời của anh ấy):

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);

5
Đây là một câu trả lời mới nhưng có lẽ đây là câu trả lời đúng nhất và đúng nhất
frazras

Điều đó thật lạ, vì đó là cách mà PHP muốn bạn làm điều đó :) Bạn có thể cho tôi biết thêm chi tiết về phiên bản HĐH và PHP của bạn không, có thể là một đoạn mã trên PasteBin hoặc sth. giống?
Larzan

16
Bạn không thể sử dụng PHP_EOL vì hệ thống và nguồn đầu vào không liên quan gì đến nhau. Nếu người dùng đặt các dòng mới trong Windows và PHP đang chạy trên Linux, kết quả có thể bị hỏng.
barell

1
@barell chính xác, đó là tình huống tôi mô tả trong phần 'cảnh báo';) Câu hỏi không nói rõ rằng đó là một đầu vào cũ được lưu trữ trong cơ sở dữ liệu. Vui lòng đọc phần 'cảnh báo' và bạn sẽ thấy rằng tôi bao quát tình huống đó.
Larzan

7
Câu trả lời này chỉ sai cho trường hợp sử dụng này. Không sử dụng hằng số PHP_EOL trong trường hợp này vì nguồn đầu vào (ví dụ: trình duyệt của người dùng) chắc chắn không phải là hệ thống của bạn. Sử dụng một giải pháp chăm sóc tất cả các kết thúc dòng khác nhau (câu trả lời từ Alin Purcaru).
Andreas

241

Bao gồm tất cả các trường hợp. Đừng tin rằng đầu vào của bạn đến từ môi trường Windows.

$skuList = preg_split("/\\r\\n|\\r|\\n/", $_POST['skuList']);

hoặc là

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);

21
Điều này sẽ dẫn đến các phần tử mảng trống nếu eol là \r\n. Để ngăn chặn điều đó, hoặc là sử dụng: preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);(lưu ý rằng \r\ntrở nên không cần thiết khi sử dụng lá cờ đó) hoặc đơn giản là đặt \r\n trước các \r:preg_split('/\r\n|\n|\r/', $_POST['skuList']);
webbiedave

2
@webbiedave PREGinksLIT_NO_EMPTY là tốt, NHƯNG nó sẽ xóa các dòng trống. Điều này có thể hoặc không thể được mong muốn.
jms

Mẫu này sẽ phù hợp với mọi chữ cái cho tôi, bởi vì nó mang lại thành công ngay cả khi không có gì. "?" có nghĩa là 0 hoặc một lần, do đó, nó có thể khớp với nhau ngay cả khi không có cả \ r và \ n. Bạn nói "đã sửa" nhưng tôi không thấy điều đó. Tôi đã sử dụng / (\ r | \ n) + / thay vào đó.
Rolf

1
@Rolf Có vẻ như tôi đã chỉnh sửa vội vàng. Sửa nó ngay. Những gì bạn nên sử dụng phụ thuộc vào việc bạn muốn các dòng trống hay không trong đầu ra. Tùy chọn từ câu trả lời của tôi cũng trả về các dòng trống.
Alin Purcaru

3
@AlinPurcaru Bạn có thể làm rõ trong câu trả lời (cả hai, một trong hai, không?) Sẽ trả về khoảng trống và cái nào không?
Patrick

150

Hãy thử "\n\r"(trích dẫn kép) hoặc chỉ "\n".

Nếu bạn không chắc chắn mình có loại EOL nào, hãy chạy một chuỗi thông số trước khi phát nổ, thay thế "\ n \ r" bằng "\ n".


52
Các trích dẫn đơn trong PHP có nghĩa là "không phân tích chuỗi này". Điều đó có nghĩa là các ký tự điều khiển của bạn không bị phân tích cú pháp, chúng được coi là bằng chữ (không phải là ngắt dòng và trả về vận chuyển, nhưng thực tế, theo nghĩa đen là '\ n \ r'). Sử dụng dấu ngoặc kép có nghĩa là "phân tích chuỗi này" và do đó, các ký tự điều khiển của bạn sẽ được phân tích cú pháp. +1
Ryan Kinal

17
/n/r? Tôi biết OP đã viết nhưng cửa sổ chính xác là\r\n
webbiedave

20
Hãy xem xét kết thúc dòng PHP của hằng số : PHP_EOL.
Daniel W.

Chào mọi người, đây chắc chắn là câu trả lời đúng! Tôi đang tự hỏi tại sao câu trả lời của @Alin Purcaru lại nhận được 44 phiếu .. Thật sai !!! Nó không phải lúc nào cũng hoạt động chính xác mặc dù có vẻ như nó thực hiện công việc .. Vì vậy, đây là nhận xét của tôi cho bất cứ ai mắc kẹt với điều tương tự
Rafik Bari

3
Chỉ cần bỏ qua \ r, HĐH cuối cùng sử dụng mà không có \ n là OS9 ( en.wikipedia.org/wiki/Newline#Repftimeations ). Do đó, điều này sẽ mang lại cho bạn kết quả tốt nhất:explode("\n", str_replace("\r", '', $string));
DanielM

15

Rất nhiều thứ ở đây:

  • Bạn cần sử dụng dấu ngoặc kép, không phải dấu ngoặc đơn, nếu không các ký tự thoát sẽ không được thoát.
  • Trình tự bình thường là \r\n, không \n\r.
  • Tùy thuộc vào nguồn, bạn có thể nhận được \nmà không có \r(hoặc thậm chí trong các trường hợp bất thường, có thể chỉ là \r)

Đưa ra điểm cuối cùng, bạn có thể thấy preg_split()việc sử dụng tất cả các biến thể có thể sẽ cung cấp cho bạn cách phân chia dữ liệu đáng tin cậy hơn explode(). Nhưng thay vào đó, bạn có thể sử dụng explode()chỉ \n, và sau đó sử dụng trim()để loại bỏ bất kỳ \rký tự nào còn sót lại.


Câu trả lời chính xác. Cô đọng, bao quát mọi thứ. Cảm ơn!
Kosta Kontos

11

Hàm php này phát nổ chuỗi theo dòng mới

Chú ý : dòng mới trong Windows\ r \ n và trong LinuxUnix\ n
hàm này thay đổi tất cả các dòng mới sang chế độ linux rồi tách nó ra.
chú ý rằng các dòng trống sẽ bị bỏ qua

function splitNewLine($text) {
    $code=preg_replace('/\n$/','',preg_replace('/^\n/','',preg_replace('/[\r\n]+/',"\n",$text)));
    return explode("\n",$code);
}

thí dụ

$a="\r\n\r\n\n\n\r\rsalam\r\nman khobam\rto chi\n\rche khabar\n\r\n\n\r\r\n\nbashe baba raftam\r\n\r\n\r\n\r\n";
print_r( splitNewLine($a) );

đầu ra

Array
(
    [0] => salam
    [1] => man khobam
    [2] => to chi
    [3] => che khabar
    [4] => bashe baba raftam
)


6

Đối với một dòng mới, nó chỉ là

$list = explode("\n", $text);

Đối với một dòng mới và trả lại vận chuyển (như trong các tệp Windows), đó là như bạn đã đăng. SkuList của bạn là một khu vực văn bản?


4

Đặt \ndấu ngoặc kép:

explode("\n", $_POST['skuList']);

Trong các trích dẫn đơn, nếu tôi không nhầm, điều này được coi là \nriêng biệt.



3

Không hoàn hảo nhưng tôi nghĩ nó phải an toàn nhất. Thêm nl2br :

$skuList = explode('<br />', nl2br($_POST['skuList']));


1

Dễ dàng như nó có vẻ

$skuList = explode('\\n', $_POST['skuList']);

Bạn chỉ cần chuyển văn bản chính xác "\ n" và viết trực tiếp \ n đang được sử dụng làm Chuỗi thoát. Vì vậy, "\\" để vượt qua một dấu gạch chéo ngược đơn giản và sau đó đặt "n"


0

Trước hết, tôi nghĩ rằng thông thường \r\n, thứ hai, những thứ đó không giống nhau trên tất cả các hệ thống. Điều đó sẽ chỉ làm việc trên các cửa sổ. Thật khó chịu khi cố gắng tìm ra cách thay thế các dòng mới vì các hệ thống khác nhau đối xử với chúng khác nhau (xem tại đây ). Bạn có thể có may mắn hơn với chỉ \n.


0

Nếu bất cứ ai khác đã thử điều này nhưng nó không hoạt động, đây là một lời nhắc nhở rằng bạn có thể đã thực hiện đánh rắm não giống như tôi.

Bạn đã thoát khỏi chuỗi đầu tiên chưa? Trong trường hợp này, ký tự dòng mới không còn là ký tự dòng mới.

Tôi đã không làm bất cứ điều gì để tránh phân tích cú pháp, chỉ cần điều chỉnh và phát nổ bởi '\ n' (nghĩa đen là dấu gạch chéo ngược và n chứ không phải là ký tự dòng mới thực sự.


3
thực hiện bất kỳ thao tác chuỗi nào sau khi thoát mysql hoàn toàn không có ý nghĩa
chung của bạn

0

Mất ngắt dòng từ đăng bài từ hộp văn bản đầu vào?
Điều làm việc nhanh hơn đối với tôi là sao chép dán bất kỳ loại văn bản hoặc loại bảng Excel hoặc HTML hoặc loại dữ liệu mới nào và dán nó vào một văn bản thay vì một hộp văn bản đầu vào: điều này giữ cho các ngắt dòng không bị hỏng trong POST.

 <textarea  id="txtArea" name="txtArea" rows="40" cols="170"></textarea>
 <br>
 <input type="submit" value="split lines into array" /> 

trong mẫu nhận tệp:

 $txtArea ='';  
 $txtArea = $_POST['txtArea'];  
 $TA = $_POST['txtArea'];  
 $string = $TA;  
 $array = preg_split ('/$\R?^/m', $string); 
// or any of these: 
// $array = explode(PHP_EOL,$string);  
// $array = explode("\n", $txtArea); 
 echo "<br>A0: ".$array[0];
 echo "<br>A1: ".@$array[1];
 echo "<br>A2: ".@$array[2];

0

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

$uniquepattern="@#$;?:~#abcz"//Any set of characters which you dont expect to be present in user input $_POST['skuList'] better use atleast 32 charecters.
$skuList=explode($uniquepattern,str_replace("\r","",str_replace("\n",$uniquepattern,$_POST['skuList'])));

0

PHP_EOL được sử dụng để tìm ký tự dòng mới theo cách tương thích đa nền tảng, do đó, nó xử lý các vấn đề về DOS / Unix.

Thử cái này:

$myString = "Prepare yourself to be caught
You in the hood gettin' shot
We going throw hell of blows
got my whole frame froze";

$myArray = explode(PHP_EOL, $myString);

print_r($myArray);

0

Bạn có thể thử nó với regex:

$skuList = explode('/[\r\n]+/', $_POST['skuList']);


0

Đây là những gì làm việc cho tôi. Đã thử nghiệm trong PHP 5.6 cũng như PHP 7.0:

    $skuList = str_replace("\\r\\n", "\n", $_POST['skuList']);
    $skuList = str_replace("\\n\\r", "\n", $skuList);

    $skuList = preg_split("/\n/", $skuList);
    print_r($skuList);
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.