Dizeleri yeni satıra bölerek nasıl dizeler ekleyebilirim?


220

Benim veritabanında satır sonları ile bir dize var. Bu dizeyi bir diziye dönüştürmek istiyorum ve her yeni satır için dizide bir dizin yeri atlamak.

Dize:

My text1
My text2
My text3

İstediğim sonuç şudur:

Array
(
    [0] => My text1
    [1] => My text2
    [2] => My text3
)

1
PHP bilmiyorum ama genellikle dizeleri için "split" adlı bir işlevi vardır. Şöyle çalışır: array = split (string, "\ n")
Sedat Kapanoglu

Muhtemelen önce yeni satırları normalleştirmelisiniz. Yöntem s($yourString)->normalizeLineEndings(), diğer birçok yararlı dize yardımcısına sahip olan github.com/delight-im/PHP-Str (MIT Lisansı altındaki kütüphane) ile kullanılabilir. Kaynak koda bir göz atmak isteyebilirsiniz.
caw

Yanıtlar:


291

Ayırıcı olarak explode" \n" işlevini kullanarak işlevi kullanabilirsiniz :

$your_array = explode("\n", $your_string_from_db);

Örneğin, bu kod parçasına sahipseniz:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);
var_dump($arr);

Bu çıktıyı alırsınız:

array
  0 => string 'My text1' (length=8)
  1 => string 'My text2' (length=8)
  2 => string 'My text3' (length=8)


Çift tırnaklı bir dize kullanmanız gerektiğine dikkat edin , bu nedenle \nsatır sonu olarak yorumlanır.
(Daha fazla ayrıntı için bu kılavuz sayfasına bakın.)


52
Bunun yerine \nönceden tanımlanmış sabiti kullanabilirsiniz PHP_EOL.
Tim

40
Lütfen tüm yeni satırlarda çalışmadığı için lütfen bu çözüme dikkat edin. David'in cevabı ile en çok başarı elde ettim
Maurice

1
Her türlü metni işleyebilmek için \ n veya \ r olarak bölmelisiniz - bu yalnızca linux ve windows satır satırlarıyla çalışır. Mac satırları dikkate alınmayacak! (\ r)
Steve Horvath

1
Sanırım Tims cevap / yorum doğru değil, çünkü bu sadece SİZİN bir linebreak maç olacak, ama diğer sistemlerden linebreaks olan dizeleri aldığınızda işe yaramaz! E-postalarla bu sorunu
Asara

7
Hayır, bu cevap ve bu cevap hakkındaki yorumlar YANLIŞ! Çünkü bu OS satırsonu karakterini etkilemez, özellikle değil PHP_EOL. Kullanmalısınız preg_split("/\\r\\n|\\r|\\n/", $value).
kjdion84

331

Bunu her zaman büyük bir başarıyla kullandım:

$array = preg_split("/\r\n|\n|\r/", $string);

(final \ r ile güncellendi, teşekkürler @LobsterMan)


11
Bu cevap Pascal'ın yerine en üstte olmalıdır. Bu her durumda işe yaramadı.!
Jithesh Kt

1
İşte cevap. Doğrulanmış olan YANLIŞ. Eh, hesselbom da var ... Bu eşdeğerini de kullanabilirsiniz: preg_split ('/ \ n | \ r /', $ string, -1, PREG_SPLIT_NO_EMPTY); güzellik uğruna :) Neden bu tek iyi cevap? Çünkü ne tür bir satır sonu alacağınızı varsayamazsınız: Mac (\ r), Windows (\ r \ n) veya Unix (\ n).
Ninj

2
\R maçlar \n , \rve\r\n
mpen

1
Veya daha kısa/\r?\n/
Jason Schilling

Bu örnek doğrudur çünkü sadece tek bir karaktere dayalı herhangi bir bölme işlemi gerçekleştiremezsiniz. Bunu yaparsanız, '\ r' veya '\ n' üzerinde tetikleme, Windows "\ r \ n" sona erdiğinde gereksiz boş bir satırla sonuçlanır. Ve önce iki karakterli Windows ayırıcısının test edilmesi önemlidir.
AndresRohrAtlasInformatik

281

\ R \ n, \ r veya \ n gibi farklı platformlarda satır sonu tanımlanır.

Dizeyi bölmek için RegExp'i kullanarak üçünü de \ R ile eşleştirebilirsiniz.

Yani sorununuz için:

$array = preg_split ('/$\R?^/m', $string);

Bu, Windows, Mac ve Linux'taki satır sonlarıyla eşleşir!


3
Bunu da kabul edilen cevap ve bu konudaki diğer cevaplar yerine kullandım. Bu yorumu sadece bilgilendirici olarak bırakmak.
Seth Malaki

3
Aslında, bu benim için işe yaramadı. Bazen dizi anahtarlarında hala mevcut olan yeni satırlar.
Maurice


32
Sadece kullanın$array = preg_split ('/\R/', $string);
Jan Goyvaerts

18
Bazen çalışmıyor! preg_split("/\r\n|\n|\r/", $string)daha iyi bir seçim
Alexey

34

PHP şimdiki sistemin yeni satır karakterlerini zaten biliyor. Sadece EOL sabitini kullanın.

explode(PHP_EOL,$string)

18
Evet, ancak bir dosya düzenlenebilir veya bu örnekte olduğu gibi Windows'ta bir db girdisi örneğin bir Linux sisteminde kullanılabilir. Genel bir yaklaşımın daha iyi olacağını düşünüyorum.
Cranio

Bunun doğru olduğundan emin değilim. Bir web sayfasındaki bir metin alanı gönderilirse, sunucunun işletim sistemine değil, kullanıcının tarayıcısına bağlı olarak farklı satır sonu karakterleri olabilir. Hangi işletim sistemini kullanırsanız kullanın, herhangi bir şeyi ayrıştırabilmeniz gerekir. Bu elbette web şeyler yaptığınızı varsayar.
Magmatic

Daha sonra, trim()herhangi bir yabancı boşluğu kaldırmak için elde edilen dizeleri kullanmanız gerekebilir .
Tim

30

Bir alternatif Davids cevap (daha hızlı bir şekilde) daha hızlıdır kullanmaktır str_replaceve explode.

$arrayOfLines = explode("\n",
                    str_replace(["\r\n","\n\r","\r"],"\n",$str)
            );

Neler oluyor:
Satır kesmeleri farklı biçimlerde olabileceğinden, str_replacebunun yerine \ n ile \ r \ n, \ n \ r ve \ r (ve orijinal \ n korunur).
Sonra patlayabilir \nve bir dizideki tüm satırlara sahip olursunuz.

Bu sayfanın src üzerinde bir kıyaslama yaptım ve satırları bir for döngüsünde 1000 kez ayırdım ve:
preg_replace11 saniyelik
str_replace & explodebir ortalama aldı yaklaşık 1 saniyelik bir ortalama aldı

Daha detay ve bencmark bilgisi benim forum


Forum bağlantınız (ve tüm alan adı) kapalı görünüyor
Nikita 웃

19

David: Harika yön, ama kaçırdın. bu benim için çalıştı:

$array = preg_split("/(\r\n|\n|\r)/", $string);

11

Bir dizeyi yeni satırlarla diziye başarılı bir şekilde bölmek için preg_ * işlevlerine, preg modellerine veya str_replace içine vb. Tüm senaryolarda, Linux / Mac veya m $ olsun, bunu yapar.

<?php 

 $array = explode(PHP_EOL, $string);
 // ...  
 $string = implode(PHP_EOL, $array);

?>

PHP_EOL , sunucu platformu tarafından kullanılan satır sonu karakterlerini tutan bir sabittir.


3
dosya farklı yeni satırları ile başka bir sistemden gelebilir, özellikle kullanılan net bir ortamda PHP
Luca C.

Tam olarak bu sabitin var olmasının nedeni budur .. ve bu problemi ele alır.
Ürkütücü

Windows'dan bir dosya alırsanız, Unix veya Mac'teki bir dosyayla eşleşmez, değil mi?
Luca C.

Her zaman, her yerde, utf8 dosyaları normalde dahil olmak üzere her zaman saf utf-8 kullanıyorsanız ve Satır sonu algılamaları için sizin kodunuz içinde PHP_EOL dışında başka bir şey yoksa, açıklandığı gibi eşleştirilir ve beklenmedik bir davranış oluşmaz. Bunu sadece bağırıp iddia ettiğimin değil. PHP_EOL kullanılabilirliği oldukça onaylanmıştır.
Ürkütücü

1
Sizin durumunuzda, kaynaklar başka bir yerden geliyorsa ve iyi oluşturulmamışsa, her neyse, str_replace (regexp'den daha hızlı) kullanırsanız daha iyi olabilir. ... sonuçta, regexp olsun. veya str_replace veya PHP_EOL, "Çalışıyorsa - dokunmayın!" diyen iyi bir eski cümle vardır. :)
Ürkütücü

9
explode("\n", $str);

"(Yerine"), aksi takdirde, satır sonu yorumlanmayacak kadar önemlidir.


9

StackOverflow bana hesselbom'un cevabı (yeterli itibar) hakkında yorum yapmama izin vermeyecek, bu yüzden kendi ...

$array = preg_split('/\s*\R\s*/', trim($text), NULL, PREG_SPLIT_NO_EMPTY);

Bu benim için en iyi sonucu verdi çünkü aynı zamanda önde gelen (ikinci \ s *) ve sondaki (first \ s *) boşlukları otomatik olarak ortadan kaldırır ve ayrıca boş satırları (PREG_SPLIT_NO_EMPTY bayrağı) atlar.

- = SEÇENEKLER = -

Eğer önde gelen boşluk tutmak istiyorsanız, sadece ikinci \ s * kurtulmak ve bunun yerine bir rtrim () yapmak ...

$array = preg_split('/\s*\R/', rtrim($text), NULL, PREG_SPLIT_NO_EMPTY);

Boş satırları tutmanız gerekiyorsa, NULL (yalnızca bir yer tutucudur) ve PREG_SPLIT_NO_EMPTY bayrağından kurtulun ...

$array = preg_split('/\s*\R\s*/', trim($text));

Veya hem önde gelen boşlukları hem de boş satırları koruyarak ...

$array = preg_split('/\s*\R/', rtrim($text));

Sonunda boşluk bırakmaya devam etmek için hiçbir neden göremiyorum, bu yüzden ilk \ s * 'ı orada bırakmanızı öneririm. Ancak, istediğiniz tek şey yeni bir satıra bölmekse (başlığın da belirttiği gibi), bu basittir (Jan Goyvaerts tarafından belirtildiği gibi) ...

$array = preg_split('/\R/', $text);

mGerçekten gerekli değildir değiştirici değil mi? Bu sadece ^ve değil $mi?
mpen

@mpen Evet, doğru olduğuna inanıyorum. Sadece hesselbom'un versiyonuyla birlikte taşıdım. Yazımı düzenleyeceğim.
Deen Foxx

7
<anti-answer>

Diğer cevaplar belirtilmiş gibi, kullandığınızdan emin olun explodeziyade splitPHP 5.3.0 itibariyle nedeniyle splitkaldırılmıştır. yani aşağıdakileri yapmak istediğiniz gibi DEĞİLDİR :

$your_array = split(chr(10), $your_string);

LF = "\ n" = chr (10), CR = "\ r" = chr (13)

</anti-answer>

3

Cronjobs'u bir crontab'da göstermeye çalışan ve her satırı nasıl ayıracağınız konusunda hayal kırıklığına uğrayan herkes için patlamayı kullanın:

$output = shell_exec('crontab -l');
$cron_array = explode(chr(10),$output);

'\ n' kullanmak işe yaramıyor ama chr (10) iyi çalışıyor: D

umarım bu bazı baş ağrılarını kurtarır.


Merhaba Jeff, SO'ya hoş geldiniz. Bunu başka birinin sorusuna cevap vermek yerine soru ve cevap olarak yeniden yazmalısınız. Bu genel bir forum değil bir Soru-Cevap sitesidir. SSS'ye bir göz atın - stackoverflow.com/faq
Rebecca Scott

Kullanılması '\n'kaçış dizileri tek tırnak yorumlanır olmadığından çalışmıyor, bunun yerine çift tırnak kullanmak gerekir: "\n"yerine 'n'Oku php.net/manual/en/language.types.string.php
Christopher K.


2

Satır sonunuzun değişmesi için $ string = nl2br ($ string) yapabilirsiniz

<br />. 

Bu şekilde sistemin \ r \ n veya \ n veya \ r kullanması önemli değildir.

Sonra bir diziye besleyebilirsiniz:

$array = explode("<br />", $string);

Not: nl2br satır sonlarını değiştirmez ... her satır sonundan önce yalnızca bir kesme etiketi ekler. Böylece, ilk dışındaki tüm dizi öğeleriniz satır sonu ile başlar. Bu sizin için önemli değilse, bu yöntem en hızlısıdır. Bu önemliyse , Jakar'ın cevabı en hızlısıdır.
Aust

2

Bu benim yolum:

$lines = preg_split('/[\r\n]+/', $db_text, NULL, PREG_SPLIT_NO_EMPTY);

Bu, tüm boş satırları da atlayacaktır.


1
$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);

foreach ($arr as $line_num => $line) {
    echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}

gerçek dizi:

$str = "My text1\nMy text2\nMy text3";
$arr = explode("\n", $str);

$array = array(); // inisiasi variable array in format array

foreach ($arr as $line) { // loop line by line and convert into array
    $array[] = $line;
};

print_r($array); // display all value

echo $array[1]; // diplay index 1

Çevrimiçi Göm:

body, html, iframe { 
  width: 100% ;
  height: 100% ;
  overflow: hidden ;
}
<iframe src="https://ideone.com/vE1gst" ></iframe>


Bu cevabın OP'nin mevcut sorunu
çözmede

1

Php dokümanlar bu aldı:

<?php
  // split the phrase by any number of commas or space characters,
  // which include " ", \r, \t, \n and \f

  $keywords = preg_split("/[\s,]+/", "hypertext language, programming");
  print_r($keywords);
?>

0

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

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

1
Kodun bir parçası olarak küfür seviyorum. :) Her neyse, \ n ile değiştirmek daha basit ve daha güvenlidir (diğer cevaplara bakınız).
Stefan Reich

0

Sadece 'temel' paketin kullanılması da basit durumlar için bir çözümdür:

> s <- "a\nb\rc\r\nd"
> l <- strsplit(s,"\r\n|\n|\r")
> l  # the whole list...
[[1]]
[1] "a" "b" "c" "d"
> l[[1]][1] # ... or individual elements
[1] "a"
> l[[1]][2]
[1] "b"
> fun <- function(x) c('Line content:', x) # handle as you wish
> lapply(unlist(l), fun)

-6

\nPHP patlaması kullanarak dize veya satır sonu arasında herhangi bir özel karakter kullanarak bunu başarabiliriz.

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.