PHP dizesini yeni satırla patlatır


253

Basit, değil mi? Bu işe yaramıyor: - \

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

28
Tek tırnak, "bu dizeyi ayrıştırma" anlamına gelir. @ Select0r'ın cevabı muhtemelen aradığınız şeydir.
Ryan Kinal


1
@ Gordon: Ha, Col. Shrapnel'in diğer soruda ne dediğini gördüm. Aslında üzücü. Yine de yakın oyumu ekliyorum.
BoltClock

9
Başkaları tarafından verilen tek tırnaklara ek olarak, CRLF çiftleri de \r\nbunun tersi değildir.
Powerlord

1
Şunu hatırlamaya çalışın: \ R etur \ N
l00k

Yanıtlar:


410

En iyi pratik

İlk cevaba yapılan yorumda belirtildiği gibi, en iyi uygulama mevcut sistemin EOL'sini ( Hat Sonu ) temsil eden PHP sabiti PHP_EOL kullanmaktır .

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

PHP, kod sisteminizi bağımsız hale getirmek için kullanabileceğiniz diğer birçok yararlı sabitleri sağlar, kullanışlı ve sistemden bağımsız dizin sabitlerini bulmak için bu bağlantıya bakın .

Uyarı

Bu sabitler sayfa sisteminizi bağımsız hale getirir, ancak sabitleri başka bir sistemde depolanmış verilerle kullandığınızda bir sistemden diğerine geçerken sorun yaşayabilirsiniz. Yeni sistemin sabitleri önceki sisteminkinden farklı olabilir ve depolanan veriler artık çalışmayabilir. Bu nedenle, sisteme bağlı parçaları kaldırmak için verilerinizi saklamadan önce tamamen ayrıştırın.

GÜNCELLEME

Andreas'ın yorumu, burada sunduğum 'En İyi Uygulama' çözümünün açıklanan kullanım durumu için geçerli olmadığını anlamamı sağladı: sunucunun EOL'sinin (PHP) tarayıcının (herhangi bir işletim sisteminin) kullandığı EOL ile hiçbir ilgisi yok, ancak bu (tarayıcı) dizenin geldiği yerdir.

Bu yüzden lütfen tüm üslerinizi kapsamak için @Alin_Purcaru ( üçü aşağı ) çözümü kullanın (ve cevabını yükseltin):

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

5
Bu yeni bir cevap ama muhtemelen en iyi ve haklı olarak kabul edilen cevap
frazras

PHP'nin bunu yapmasını istediği şekilde bu garip, :) Bana OS ve PHP sürümünüz hakkında daha fazla ayrıntı verebilir misiniz, belki PasteBin veya sth üzerinde bir kod parçası. benzer?
Larzan

16
Sistem ve giriş kaynağının birbiriyle hiçbir ilgisi olmadığı için PHP_EOL kullanamazsınız. Kullanıcı Windows'a yeni satırlar eklerse ve PHP Linux'ta çalışıyorsa sonuç bozulabilir.
barell

1
@barell tam olarak, 'uyarı' bölümünde açıkladığım durum şu;) Soru açıkça veritabanında depolanan eski bir girdi olduğunu belirtmedi. Lütfen 'uyarı' bölümünü okuyun ve orada bu durumu kapsadığımı göreceksiniz.
Larzan

7
Bu cevap bu kullanım durumu için yanlıştır. Bu durumda PHP_EOL sabitini kullanmayın çünkü giriş kaynağı (örneğin kullanıcının tarayıcısı) kesinlikle sizin sisteminiz değildir. Tüm farklı hat sonlarıyla ilgilenen bir çözüm kullanın (Alin Purcaru'dan cevap).
Andreas

241

Tüm vakaları kapsar. Girişinizin bir Windows ortamından geldiğine güvenmeyin.

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

veya

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

21
Bu, eol ise boş dizi öğelerine neden olur \r\n. Bunu önlemek için, her iki kullanım: preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);(not \r\nveya basitçe O bayrağı kullanırken gereksiz hale gelir) \r\n önce\r :preg_split('/\r\n|\n|\r/', $_POST['skuList']);
webbiedave

2
@webbiedave PREG_SPLIT_NO_EMPTY güzel, ancak boş satırları silecek. Bu arzu edilebilir veya edilmeyebilir.
jms

Bu kalıp benim için her harfle eşleşir, çünkü hiçbir şey olmasa bile başarı ile sonuçlanır. "?" 0 veya bir kez anlamına gelir, bu nedenle hem \ r hem de \ n mevcut olmasa bile eşleşmesi mümkündür. "Sabit" diyorsun ama görmüyorum. Bunun yerine / (\ r | \ n) + / kullandım.
Rolf

1
@Rolf Görünüşe göre acele ettim. Şimdi düzeltildi. Kullanmanız gerekenler, çıktıda boş satırlar isteyip istemediğinize bağlıdır. Cevabımdaki seçenek de boş satırlar döndürüyor.
Alin Purcaru

3
@AlinPurcaru Cevapta hangisinin (ikisi de, ikisi de değil) boşluk döndürüp hangisini döndürmeyeceğini açıklayabilir misiniz?
Patrick

150

Deneyin "\n\r"(çift tırnak) veya sadece "\n".

Hangi EOL türüne sahip olduğunuzdan emin değilseniz, patlamanızdan önce str_replace komutunu çalıştırın ve "\ n \ r" yerine "\ n" yazın.


52
PHP'deki tek tırnak "bu dizeyi ayrıştırma" anlamına gelir. Bu, kontrol karakterlerinizin ayrıştırılmadığı, değişmez olarak alındığı anlamına gelir (satır sonu ve satır başı değil, gerçek, gerçek '\ n \ r'). Çift tırnak kullanmak "bu dizeyi ayrıştır" anlamına gelir ve böylece kontrol karakterleriniz ayrıştırılır. +1
Ryan Kinal

17
/n/r? OP yazdı biliyorum ama doğru windows eol olduğunu\r\n
webbiedave

20
PHP düşünün hat sonu sabiti: PHP_EOL.
Daniel W.

Herkese merhaba, bu kesinlikle doğru cevap! Acaba @Alin Purcaru cevap 44 oy aldı .. Yanlış !!! İşi yapıyor gibi görünse de her zaman düzgün çalışmıyor .. İşte aynı şeye takılan herkes için benim yorumum
Rafik Bari

3
Sadece \ r'yi dikkate almayın, \ n olmadan kullanacak son işletim sistemi OS9'du ( en.wikipedia.org/wiki/Newline#Representations ). Bu nedenle, bu size en iyi sonuçları verecektir:explode("\n", str_replace("\r", '', $string));
DanielM

15

Burada bir sürü şey var:

  • Tek tırnak değil, çift tırnak kullanmanız gerekir, aksi takdirde çıkış karakterleri kaçmaz.
  • Normal dizi \r\n, değil \n\r.
  • Kaynağa bağlı olarak, sadece alma olabilir \nolmadan \r(hatta olağandışı durumlarda muhtemelen sadece \r)

Son nokta göz önüne alındığında, preg_split()olası tüm varyantları kullanmanın, verileri bölmekten daha güvenilir bir yol sağlayacağını görebilirsiniz explode(). Ancak alternatif explode()olarak sadece ile kullanabilir \nve daha sonra etrafta asılı kalan karakterleri trim()kaldırmak için kullanabilirsiniz \r.


Mükemmel cevap. Özlü, her şeyi kapsar. Teşekkürler!
Kosta Kontos

11

Bu php fonksiyonu ile dize patlayabilir satır

Dikkat : yeni satır Windows'un olan \ r \ n ve Linux ve Unix olduğunu \ n
Bu fonksiyon değişikliği için tüm yeni hat linux moduna sonra ayrıldı.
boş satırların dikkate alınmayacağına dikkat edin

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

misal

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

çıktı

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


6

Yeni bir çizgi için, sadece

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

Yeni bir satır ve satır başı için (Windows dosyalarında olduğu gibi) yayınladığınız gibidir. SkuList'iniz bir metin alanı mı?


4

Yerleştirin \nçift tırnak:

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

Tek tırnak içinde, eğer yanılmıyorsam, bu ayrı \ve nayrı olarak ele alınır .



3

Mükemmel değil ama bence en güvenli olmalı. Nl2br ekle :

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


1

Göründüğü kadar kolay

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

Sadece tam metni geçmeleri gerekiyor "\ n" ve yazma n \ bir kaçış dizisine olarak kullanılıyor. Yani "\\" basit bir ters eğik çizgi geçmek ve sonra "n" koymak


0

Her şeyden önce, sanırım \r\n, ikincisi, bunlar tüm sistemlerde aynı değildir. Bu sadece pencerelerde çalışır. Yeni hatların nasıl değiştirileceğini anlamaya çalışmak biraz sinir bozucu çünkü farklı sistemler onlara farklı davranıyor ( buraya bakın ). Sadece iyi şanslar olabilir \n.


0

Başka biri bunu denediyse ama işe yaramazsa, bu, I ile aynı beyin osuruğunu yapmış olabileceğinizi hatırlatmaktadır.

Önce mysql dizeden kaçtın mı? Bu durumda, yeni satır karakteri artık yeni satır karakteri değildir.

Ayrıştırmaktan kaçınmak için hiçbir şey yapmadım, sadece '\ n' ile uyarlandı ve patladı ( gerçek satırsonu karakteri yerine ters eğik çizgi ve n) .


3
mysql kaçış sonra ne olursa olsun dize manipülasyonları yapmak kesinlikle hiçbir anlam ifade etmiyor
Sizin Common Sense

0

Giriş metin kutularından yayın gönderme nedeniyle satır sonları mı kaybediliyor?
Benim için daha hızlı çalışan, herhangi bir metni veya Excel veya HTML tablo türünü veya yeni satır veri türünü kopyalayıp bir girdi metin kutusu yerine bir metin alanına yapıştırmaktır: bu, satır satırlarını POST'ta sağlam tutar.

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

form alma dosyasında:

 $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

Bu yöntem her zaman benim için çalışıyor:

$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 Görünüşe göre yeni satır karakterini platformlar arası uyumlu bir şekilde bulmak için kullanılır, bu nedenle DOS / Unix sorunlarını işler.

Bunu dene:

$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

Normal ifade ile deneyebilirsiniz:

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


0

İşte benim için işe yarayan. PHP 5.6 ve PHP 7.0'da test edilmiştir:

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

    $skuList = preg_split("/\n/", $skuList);
    print_r($skuList);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.