2010-10-22 31 views
170

Đơn giản, đúng không? Vâng, điều này không làm việc: - \Giải mã chuỗi PHP theo dòng mới

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

Dấu nháy đơ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. –

+2

có thể trùng lặp của [làm thế nào để loại bỏ các dòng mới và trả về từ chuỗi php?] (Http://stackoverflow.com/questions/3986299/how-to-remove-new-lines-and-returns-from-php-string) mà đã là một bản sao của [Đáng tin cậy loại bỏ các dòng tin tức từ chuỗi] (http://stackoverflow.com/questions/2274506/reliably-remove-newlines-from-string) và [một số người khác] (http://stackoverflow.com/ tìm kiếm? q = remove + newlines + from + string + php). Sử dụng chức năng tìm kiếm trước khi đặt câu hỏi! – Gordon

+1

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

Trả lời

231

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

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

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

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

Warning

Những hằng làm cho hệ thống trang của bạn độc lập, nhưng bạn có thể gặp sự cố khi di chuyển từ một hệ thống khác khi bạn sử dụng hằng số với dữ liệu được lưu trữ trên hệ thống khác. Hằng số của hệ thống mới có thể khác với 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ữ nó để loại bỏ bất kỳ bộ phận phụ thuộc hệ thống nào.

CẬP NHẬT

bình luận khiến tôi nhận ra rằng '

Andreas Thực hành tốt nhất' giải pháp tôi trình bày ở đây không áp dụng cho việc sử dụng hợp cụ thể được mô tả: EOL của máy chủ (PHP) không có bất cứ điều gì để làm với EOL trình duyệt (bất kỳ hệ điều hành nào) đang sử dụng, nhưng trình duyệt (đó là trình duyệt) là nơi chuỗi đến từ đó.

Vì vậy, hãy sử dụng các giải pháp từ @Alin_Purcaru (three down) để trang trải tất cả các căn cứ của bạn (và upvote câu trả lời của mình):

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

Đây là câu trả lời mới nhưng có lẽ là câu trả lời đúng nhất và được chấp nhận – frazras

+3

Điều này không phù hợp với tôi – dspacejs

+0

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

3

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

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

Đối với một dòng mới và vận chuyển trở lại (như trong các tập tin Windows), đó là khi bạn đăng. SkuList của bạn có phải là vùng văn bản không?

+2

Yêu cầu dấu ngoặc kép. – meagar

143

Hãy thử "\n\r" (dấu ngoặc kép) hoặc chỉ "\n".

Nếu bạn không chắc chắn loại EOL nào bạn có, hãy chạy str_replace trước khi phát, thay thế "\ n \ r" bằng "\ n".

+48

Dấu nháy đơn trong PHP có nghĩa là "không phân tích cú pháp chuỗi này". Điều đó có nghĩa là các ký tự điều khiển của bạn không được phân tích cú pháp, chúng được lấy dưới dạng chữ (không phải là ngắt dòng và trả về dòng chữ, nhưng thực tế là chữ '\ 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 –

+17

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

+19

Xem xét kết thúc * của dòng * *:' PHP_EOL'. – DanFromGermany

153

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

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

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

+0

@ webbiedave cố định –

+1

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

3

Bạn đã cố gắng sử dụng dấu ngoặc kép?

4

Đặt \n trong dấu ngoặc kép:

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

Trong dấu nháy đơn, nếu tôi không nhầm, đây được coi là \n riêng.

0

Trước hết, tôi nghĩ nó thường là \r\n, thứ hai, tất cả đều không giống nhau trên tất cả các hệ thống. Điều đó sẽ chỉ hoạt động trên các cửa sổ. Đó là loại khó chịu 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 here). Bạn có thể có may mắn hơn chỉ với \n.

12

Rất nhiều điều ở đây:

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

Với điểm cuối cùng, bạn có thể tìm preg_split() sử dụng tất cả các biến thể có thể sẽ cung cấp cho bạn cách phân tách dữ liệu đáng tin cậy hơn explode(). Nhưng cách khác bạn có thể sử dụng explode() chỉ với \n và sau đó sử dụng trim() để xóa bất kỳ \r ký tự nào còn lại treo xung quanh.

+0

Rất vui khi ai đó đã chỉ ra rằng đó là \ r \ n và không \ n \ r. –

0

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

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

tôi đã không làm bất cứ điều gì để tránh phân tích nó, chỉ cần thích nghi và phát nổ '\ n' (nghĩa là dấu chéo ngược và n chứ không phải là ký tự xuống dòng thực tế.

+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 –

7

thử

explode(chr(10), $_POST['skuList']); 
0

Mất Những gì làm việc nhanh hơn cho tôi là sao chép dán bất kỳ văn bản hoặc loại bảng Excel hoặc HTML hoặc loại dữ liệu mới và dán nó vào một vùng văn bản thay vì một inputextbox: điều này giữ cho các dấu ngắt dòng vẫn còn nguyên vẹn các BÀI ĐĂNG.

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

theo hình thức nhận hồ sơ:

$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: "[email protected]$array[1]; 
echo "<br>A2: "[email protected]$array[2]; 
10

php function này nổ tung chuỗi bởi newline

Attention: dòng mới trong của Windows\ r \ n và trong LinuxUnix\ n
chức năng này thay đổi tất cả các dòng mới thành chế độ linux rồi chia.
chú ý rằng dòng sản phẩm nào sẽ bị bỏ qua

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

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 
) 
0

Phương pháp này luôn luôn làm việc cho 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']))); 
1

Hãy thử điều này:

explode(PHP_EOF, $lines); 
+0

Chắc chắn PHP_EOL thay vì EOF – Ewen

0

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

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

PHP_EOL là bề ngoài là sử dụng để tìm kí tự xuống dòng trong một cách nền tảng tương thích, vì vậy nó xử lý các vấn đề hệ điều hành DOS/Unix.

Hãy thử điều 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); 
Các vấn đề liên quan