PHP bir dizesindeki her satırı üzerinde yineleme

6 Cevap php

Ben kullanıcı bir textarea içine dosyanın içeriğini yapıştırın / bir metin dosyası veya kopyasını yükleyin ya sağlayan bir form var. Ben kolayca ikisi arasında ayrım ve bir dize değişkeni girdi hangisi koymak, ama nereye ben oraya gitmek yapabilirsiniz?

Ben sonra bir SQL sorgusu oluşturmak, verileri sterilize, tam olarak bir belirteç (boşluk, sekme, virgül, vs) sahip olduğundan emin olun, dize her satırı (tercihen farklı makinelerde satırsonlarının endişesi değil) üzerinde yinelemek gerekiyor hatlardan kapalı göre.

Ben oldukça iyi bir programcı değilim, ben bunu nasıl hakkında genel bir fikir biliyorum, ama bu çok uzun ben yanlış şeyler arıyor ve bu nedenle gereksiz bilgi ile geliyorum hissediyorum PHP ile çalıştı yana oldu. Ben yaşıyorum anahtar sorun ben dize line-by-line içeriğini okumak istiyor. Bu bir dosya olsaydı, kolay olurdu.

Ben daha çok bunu yapmak için nasıl bir algoritma, kullanışlı PHP fonksiyonları için değil arıyorum. Herhangi bir öneriniz?

6 Cevap

preg_split metni içeren değişken ve dönen diziye üzerinde yineleme:

foreach(preg_split("/((\r?\n)|(\r\n?))/", $subject) as $line){
    // do stuff with $line
} 

Eğer diferent sistemleri satırsonu işlemek gerekiyorsa sadece PHP sabiti PHP_EOL (http://php.net/manual/en/reserved.constants.php) önceden kullanmak ve sadece düzenli ifade motorun yükünü önlemek için patlayabilir kullanabilirsiniz .

$lines = explode(PHP_EOL, $subject);

strtok yerine preg_split: Ben bir significantly daha hızlı (ve bellek verimli) bir alternatif önermek istiyorum.

$separator = "\r\n";
$line = strtok($subject, $separator);

while ($line !== false) {
    # do something with $line
    $line = strtok( $separator );
}

strtok 1.4 saniye sürdü oysa, preg_split 27.7 saniye sürdü: performansını test, ben 17 bin hatları ile bir test dosyası üzerinde 100 kez tekrarlanır.

Ve PHP4.1.0 itibariyle, boş satırlar / belirteçleri atlamak - $separator olarak tanımlanır olsa "\r\n", strtok karakteri ya da üzerinde ayrı unutmayın.

Strtok manuel girişine bakın: http://www.php.net/manual/function.strtok.php

Kyril cevabı en farklı makinelerde satırsonlarını idare edebilmek gerekir düşünüyor.

"Ben çoğunlukla kullanışlı PHP fonksiyonları değil, bunu yapmak için nasıl bir algoritma için arıyorum. Herhangi bir öneriniz var mı?"

Ben bu bir sürü kullanabilirsiniz:

explode() tek sınırlayıcı verilen bir diziye bir dize bölmek için kullanılabilir.

geri dize diziden gitmek için, () patlamak olduğu meslektaşı patlar.

Bu aşırı karmaşık ve çirkin ama bence bu gitmek için yoludur:

$fp = fopen("php://memory", 'r+');
fputs($fp, $data);
rewind($fp);
while($line = fgets($fp)){
  // deal with $line
}
fclose($fp);
foreach(preg_split('~[\r\n]+~', $text) as $line){
    if(empty($line) or ctype_space($line)) continue; // skip only spaces
    // if(!strlen($line = trim($line))) continue; // or trim by force and skip empty
    // $line is trimmed and nice here so use it
}

^ this is how you break lines properly, çapraz platform ile Regexp :) uyumlu