Rozbij łańcuch PHP według nowej linii


253

Proste, prawda? Cóż, to nie działa: - \

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

28
Pojedyncze cudzysłowy oznaczają „nie analizuj tego ciągu”. @ Odpowiedź Select0r jest prawdopodobnie tym, czego szukasz.
Ryan Kinal

3
możliwy duplikat usuwania nowych linii i zwrotów z ciągu php? który był już duplikatem niezawodnego usuwania wiadomości z łańcucha i niektórych innych . Skorzystaj z funkcji wyszukiwania, zanim zaczniesz zadawać pytania!
Gordon

1
@Gordon: Ha, widziałem, co płk Shrapnel powiedział w innym pytaniu. Właściwie to trochę smutne. Dodam jednak mój głos.
BoltClock

9
Oprócz pojedynczych cytatów wymienionych przez innych, pary CRLF \r\nnie są na odwrót.
Władca

1
Staraj się pamiętać, że: \ R
etur

Odpowiedzi:


410

Najlepsze praktyki

Jak wspomniano w komentarzu do pierwszej odpowiedzi, najlepszą praktyką jest stosowanie stałej PHP_EOL PHP, która reprezentuje EOL obecnego systemu ( End Of Line ).

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

PHP zapewnia wiele innych bardzo przydatnych stałych , których można użyć do uniezależnienia systemu kodu. Zobacz ten link, aby znaleźć przydatne i niezależne od systemu stałe katalogów.

Ostrzeżenie

Stałe te uniezależniają system stron, ale możesz napotkać problemy podczas przenoszenia z jednego systemu do drugiego, gdy używasz stałych z danymi przechowywanymi w innym systemie. Stałe nowego systemu mogą się różnić od poprzednich, a przechowywane dane mogą już nie działać. Więc całkowicie przeanalizuj swoje dane przed zapisaniem, aby usunąć części zależne od systemu.

AKTUALIZACJA

Komentarz Andreasa uświadomił mi, że przedstawione tutaj rozwiązanie „najlepszych praktyk” nie ma zastosowania do opisanego przypadku użycia: EOL serwera (PHP) nie ma nic wspólnego z EOL, którego używa przeglądarka (dowolny system operacyjny), ale to (przeglądarka) pochodzi z łańcucha.

Więc skorzystaj z rozwiązania @Alin_Purcaru ( trzy w dół ), aby objąć wszystkie swoje bazy (i głosuj na jego odpowiedź):

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

5
To jest nowa odpowiedź, ale prawdopodobnie najlepsza i słusznie przyjęta odpowiedź
frazras

To dziwne, ponieważ PHP tak chce, abyś to zrobił :) Czy możesz podać mi więcej szczegółów na temat swojego systemu operacyjnego i wersji PHP, może kawałek kodu na PasteBin lub coś. podobny?
Larzan,

16
Nie możesz użyć PHP_EOL, ponieważ system i źródło wejściowe nie mają ze sobą nic wspólnego. Jeśli użytkownik umieści nowe wiersze w systemie Windows, a PHP działa w systemie Linux, wynik może być uszkodzony.
barell

1
@ barell dokładnie, to jest sytuacja, którą opisuję w części „ostrzeżenie”;) W pytaniu nie stwierdzono wprost, że jest to stare wejście przechowywane w bazie danych. Przeczytaj część „Ostrzeżenie”, a zobaczysz, że opisuję tam tę sytuację.
Larzan

7
Ta odpowiedź jest po prostu zła dla tego przypadku użycia. W tym przypadku nie używaj stałej PHP_EOL, ponieważ źródłem wejściowym (np. Przeglądarką użytkownika) zdecydowanie nie jest twój system. Użyj rozwiązania, które zajmie się wszystkimi różnymi zakończeniami linii (odpowiedź Alin Purcaru).
Andreas

241

Obejmują wszystkie sprawy. Nie polegaj, że dane wejściowe pochodzą ze środowiska Windows.

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

lub

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

21
Spowoduje to, że elementy eol będą puste \r\n. Aby temu zapobiec, należy użyć: preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);(uwaga, że \r\nstaje się zbędne przy użyciu tej flagi) lub po prostu umieścić \r\n przed tym \r:preg_split('/\r\n|\n|\r/', $_POST['skuList']);
webbiedave

2
@webbiedave PREG_SPLIT_NO_EMPTY jest fajny, ALE usunie puste linie. To może, ale nie musi być pożądane.
jms

Ten wzór pasowałby do mnie dla każdej litery, ponieważ przynosi sukces, nawet jeśli nic nie jest obecne. „?” oznacza 0 lub jeden raz, więc możliwe jest dopasowanie, nawet jeśli \ r i \ n nie są obecne. Mówisz „naprawiony”, ale tego nie widzę. Zamiast tego użyłem / (\ r | \ n) + /.
Rolf

1
@Rolf Wygląda na to, że dokonałem edycji w pośpiechu. Poprawiłem to teraz. To, czego powinieneś użyć, zależy od tego, czy chcesz otrzymać puste wiersze, czy nie na wyjściu. Opcja z mojej odpowiedzi zwraca również puste linie.
Alin Purcaru,

3
@AlinPurcaru Czy możesz wyjaśnić w odpowiedzi, które (oba, oba też nie?) Zwrócą puste miejsca, a które nie?
Patrick

150

Spróbuj "\n\r"(podwójne cudzysłowy) lub po prostu "\n".

Jeśli nie masz pewności, jaki typ EOL posiadasz, uruchom komendę str_replace przed wybuchem, zamieniając „\ n \ r” na „\ n”.


52
Pojedyncze cudzysłowy w PHP oznaczają „nie analizuj tego ciągu”. Oznacza to, że twoje znaki kontrolne nie są analizowane, są traktowane jako dosłowne (nie łamanie linii i powrót karetki, ale rzeczywiste, dosłowne „\ n \ r”). Użycie podwójnych cudzysłowów oznacza „parsuj ten ciąg”, a zatem znaki kontrolne zostaną przeanalizowane. +1
Ryan Kinal

17
/n/r? Wiem, że OP napisał to, ale poprawny eol systemu Windows to\r\n
webbiedave

20
Rozważmy PHP końca linii stałej: PHP_EOL.
Daniel W.

Cześć wszystkim, to zdecydowanie odpowiednia odpowiedź! Zastanawiam się, dlaczego odpowiedź @Alin Purcaru uzyskała 44 głosy .. To źle !!! Nie zawsze działa poprawnie, chociaż wydaje się, że działa. Więc oto mój komentarz dla każdego, kto postawił na to samo
Rafik Bari

3
Po prostu zignoruj ​​\ r, ostatnim systemem operacyjnym, który go używał bez \ n był OS9 ( en.wikipedia.org/wiki/Newline#Representations ). Dzięki temu uzyskasz najlepsze wyniki:explode("\n", str_replace("\r", '', $string));
DanielM

15

Wiele rzeczy tutaj:

  • Musisz użyć podwójnych cudzysłowów, a nie pojedynczych cudzysłowów, w przeciwnym razie znaki ucieczki nie zostaną usunięte.
  • Normalna sekwencja \r\nnie jest \n\r.
  • W zależności od źródła możesz być po prostu \nbez \r(lub nawet w nietypowych przypadkach, być może tylko \r)

Biorąc pod uwagę ostatni punkt, może okazać się, że preg_split()użycie wszystkich możliwych wariantów da ci bardziej niezawodny sposób podziału danych niż explode(). Ale alternatywnie możesz użyć explode()just \n, a następnie użyć, trim()aby usunąć wszelkie \rpostacie, które pozostały w pobliżu.


Świetna odpowiedź. Zwięzły, obejmuje wszystko. Dzięki!
Kosta Kontos

11

Ta funkcja php wybuchnąć ciąg przez nowego wiersza

Uwaga : Nowa linia w systemie Windows jest \ r \ n oraz Linux i Unix jest \ n
zmiana ta funkcja wszystkie nowe linie do linux trybie następnie podzielić ją.
zwróć uwagę, że puste linie będą ignorowane

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

przykład

$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) );

wynik

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


6

W przypadku nowej linii jest po prostu

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

W przypadku nowej linii i powrotu karetki (jak w plikach Windows) jest tak, jak napisałeś. Czy twoja lista jest obszarem tekstowym?


4

Umieść \nw podwójnych cudzysłowach:

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

W pojedynczych cudzysłowach, jeśli się nie mylę, to jest traktowany jak \i noddzielnie.



3

Nie idealnie, ale myślę, że musi być najbezpieczniej. Dodaj nl2br :

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


1

Tak proste, jak się wydaje

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

Musisz tylko podać dokładny tekst „\ n”, a bezpośrednie pisanie \ n jest używane jako Sekwencja Escape. Więc „\\”, aby przekazać prosty ukośnik, a następnie wpisz „n”


0

Po pierwsze, myślę, że zwykle po \r\ndrugie, nie są takie same na wszystkich systemach. Działa to tylko w systemie Windows. To trochę irytujące, próbując wymyślić, jak zastąpić nowe linie, ponieważ różne systemy traktują je inaczej (patrz tutaj ). Możesz mieć więcej szczęścia \n.


0

Jeśli ktokolwiek próbował, ale to nie działało, jest to przypomnienie, że mogłeś zrobić ten sam pierdnięcie mózgu jak ja.

Czy mysql najpierw uniknął łańcucha? W tym przypadku znak nowej linii nie jest już znakiem nowej linii.

Nie zrobiłem nic, aby uniknąć parsowania, po prostu dostosowałem i eksplodowałem przez „\ n” (dosłownie odwrotny ukośnik i n , niż faktyczny znak nowej linii.


3
wykonywanie jakichkolwiek operacji na łańcuchach po ucieczce mysql nie ma absolutnie żadnego sensu
Your Common Sense

0

Tracisz przerwy w liniach od wysyłania z wejściowych pól tekstowych?
Dla mnie szybsze jest kopiowanie wklejania dowolnego tekstu, tabeli Excela lub HTML lub typu danych nowej linii i wklejanie go do obszaru tekstowego zamiast pola tekstowego wejściowego: dzięki temu łamanie wierszy pozostanie nienaruszone w POST.

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

w formularzu odbierającym plik:

 $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

Ta metoda zawsze działa dla mnie:

$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 jest rzekomo używany do znalezienia znaku nowej linii w sposób kompatybilny z wieloma platformami, więc obsługuje problemy DOS / Unix.

Spróbuj tego:

$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

Możesz spróbować z regex:

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


0

Oto, co zadziałało dla mnie. Testowane w PHP 5.6 oraz 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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.