@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ź):
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.
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\nprzed 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”.
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
)
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”
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.
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.
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.
<textareaid="txtArea"name="txtArea"rows="40"cols="170"></textarea><br><inputtype="submit"value="split lines into array"/>
$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'])));
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);
\r\n
nie są na odwrót.Odpowiedzi:
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 ).
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ź):
źródło
Obejmują wszystkie sprawy. Nie polegaj, że dane wejściowe pochodzą ze środowiska Windows.
lub
źródło
\r\n
. Aby temu zapobiec, należy użyć:preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);
(uwaga, że\r\n
staje 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']);
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”.
źródło
/n/r
? Wiem, że OP napisał to, ale poprawny eol systemu Windows to\r\n
PHP_EOL
.explode("\n", str_replace("\r", '', $string));
Wiele rzeczy tutaj:
\r\n
nie jest\n\r
.\n
bez\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\r
postacie, które pozostały w pobliżu.źródło
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
przykład
wynik
źródło
próbować
źródło
W przypadku nowej linii jest po prostu
W przypadku nowej linii i powrotu karetki (jak w plikach Windows) jest tak, jak napisałeś. Czy twoja lista jest obszarem tekstowym?
źródło
Umieść
\n
w podwójnych cudzysłowach:explode("\n", $_POST['skuList']);
W pojedynczych cudzysłowach, jeśli się nie mylę, to jest traktowany jak
\
in
oddzielnie.źródło
Czy próbowałeś używać podwójnych cudzysłowów?
źródło
Nie idealnie, ale myślę, że musi być najbezpieczniej. Dodaj nl2br :
źródło
Spróbuj tego:
źródło
Tak proste, jak się wydaje
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”
źródło
Po pierwsze, myślę, że zwykle po
\r\n
drugie, 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
.źródło
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.
źródło
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.
w formularzu odbierającym plik:
źródło
Ta metoda zawsze działa dla mnie:
źródło
Spróbuj tego:
źródło
Możesz spróbować z regex:
$skuList = explode('/[\r\n]+/', $_POST['skuList']);
źródło
Oto, co zadziałało dla mnie. Testowane w PHP 5.6 oraz PHP 7.0:
źródło