PHP bu regex gerçekten çalışır mı?

5 Cevap php

Ben bu yanlış gidiyor neden düzenli ifadesi uzmanı söyleyebilir umuyorum:

Bu regex:

$pattern = '/(?<percent>[0-9]{1,3}\.[0-9]{1,2})% of (?<filesize>.+) at/';

String bu tür uymalıdır:

[download] 87.1% of 4.40M at 107.90k/s ETA 00:05 
[download] 89.0% of 4.40M at 107.88k/s ETA 00:04 
[download] 91.4% of 4.40M at 106.09k/s ETA 00:03 
[download] 92.9% of 4.40M at 105.55k/s ETA 00:03

Düzeltin? Bu yukarıdaki girişi ile maç almazsınız regex ile yanlış bir şey var mı? Burada tam kullanımı:

while(!feof($handle))
{
    $progress = fread($handle, 8192);
    $pattern = '/(?<percent>[0-9]{1,3}\.[0-9]{1,2})% of (?<filesize>.+) at/';
    if(preg_match_all($pattern, $progress, $matches)){
    //matched
    }
}

fread düzgün çalışması için regex etkileyen olması ile ne kadar okunan olabilir mi?

Ben yeni bir sunucu üzerinde neden çalışmadığını belirlemek için çalışıyorum ben gerçekten teyit etmesi gerekiyor. Bu soru, Change in Server Permits script not to work. Can this be due to PHP.ini being different? ile ilgilidir

Tüm teşekkürler

Update 2

Ben regex test etmek için bir test komut dosyası yaptık ama kendi kendine bile çalışmıyor?

<?php 

error_reporting(E_ALL);

echo 'Start';

$progress = "[download]75.1% of 4.40M at 115.10k/s ETA 00:09 [download] 77.2% of 4.40M at 112.36k/s ETA 00:09 [download] 78.6% of 4.40M at 111.41k/s ETA 00:08 [download] 80.3% of 4.40M at 110.80k/s ETA 00:07 [download] 82.3% of 4.40M at 110.30k/s ETA 00:07 [download] 84.3% of 4.40M at 108.33k/s ETA 00:06 [download] 85.7% of 4.40M at 107.62k/s ETA 00:05 [download] 87.5% of 4.40M at 107.21k/s ETA 00:05 [download] 89.5% of 4.40M at 105.10k/s ETA 00:04 [download] 90.7% of 4.40M at 106.45k/s ETA 00:03 [download] 93.2% of 4.40M at 104.92k/s ETA 00:02 [download] 94.8% of 4.40M at 104.40k/s ETA 00:02 [download] 96.5% of 4.40M at 102.47k/s ETA 00:01 [download] 97.7% of 4.40M at 103.48k/s ETA 00:01 [download] 100.0% of 4.40M at 103.15k/s ETA 00:00 [download] 100.0% of 4.40M at 103.16k/s ETA 00:00
";

$pattern = '/(?<percent>\d{1,3}\.\d{1,2})%\s+of\s+(?<filesize>[\d.]+[kBM]) at/';

if(preg_match_all($pattern, $progress, $matches)){
    echo 'match';
}

echo '<br>Done<br>';    

?>

5 Cevap

Ben adında yakalama aşina değilim, ama ben PHP olması gerektiğini düşünüyorum:

$pattern = '/(?P<percent>[0-9]{1,3}\.[0-9]{1,2})% of (?P<filesize>.+) at/';

Soru işaretinden sonra P dikkat edin.

Source:

Regex bana iyi görünüyor.

Ancak, ben artıracak bazı şeyler vardır:

  • "\s+", yerine " " ile boşluk
  • ile sayılar "\d", "[0-9]" ile (aynı şey, sadece daha kısa) değil
  • ".+" ile değil dosya boyutu, ama daha özel bir şey

Bu benim sürüm olacaktır:

(?<percent>\d{1,3}\.\d{1,2})%\s+of\s+(?<filesize>[\d.]+[kBM])

(Ben tahmin ediyorum: çok olası değil) Yanlış numara biçimlerini almak için beklemek ne kadar bağlı, bunu kısaltmak yapabilirsiniz:

(?<percent>[\d.]+)%\s+of\s+(?<filesize>[\d.]+[kBM])

Lütfen akışı aslında bir okuma veri fazla 8 KB teslim ederse, muhtemelen eşleşen engellemek hangi, son satırı kesecek olacak. Bunun yerine, fgets() kullanarak bir anda dere bir satır okumaya çalışın.

Eğer ben kabul satıra maç istiyorum çünkü, satır tabanlı okumak için fgets () kullanmak istiyorsunuz. Yerine satır başına uymuyorsa, preg_match_all kullanmanız gerekir, ama sadece preg_match olmaz.

Yalnızca yüzde 1 ondalık var gibi görünüyor, ama 1,2 basamak maç?

Bu yukarıdaki girişi ile maç almazsınız regex ile yanlış bir şey var mı?

Ben değil görebiliyorum, ama çok fazla maç yapmak için terslik yok bir şey var ki: Eğer gerçekten satırsonlarını yoksa, o zaman bu:

(?P<filesize>.+) at

"at" baştan son açgözlülükle maç giriş. Ben deftere bütün örnek girişine karşı maç Yani, ben bir olsun:

75.1

(Iyi) ve bir dosya boyutu:

4.40M at 115.10k/s ETA 00:09 [download] 77.2% of 4.40M at 112.36k/s ETA 00:09 [download] 78.6% of 4.40M at 111.41k/s ETA 00:08 [download] 80.3% of 4.40M at 110.80k/s ETA 00:07 [download] 82.3% of 4.40M at 110.30k/s ETA 00:07 [download] 84.3% of 4.40M at 108.33k/s ETA 00:06 [download] 85.7% of 4.40M at 107.62k/s ETA 00:05 [download] 87.5% of 4.40M at 107.21k/s ETA 00:05 [download] 89.5% of 4.40M at 105.10k/s ETA 00:04 [download] 90.7% of 4.40M at 106.45k/s ETA 00:03 [download] 93.2% of 4.40M at 104.92k/s ETA 00:02 [download] 94.8% of 4.40M at 104.40k/s ETA 00:02 [download] 96.5% of 4.40M at 102.47k/s ETA 00:01 [download] 97.7% of 4.40M at 103.48k/s ETA 00:01 [download] 100.0% of 4.40M at 103.15k/s ETA 00:00 [download] 100.0% of 4.40M

(O kadar iyi değil). Bu açgözlü olmayan maç kullanmak önlemek için ". +?", Ya da "[^] +" ya Tomalak versiyonu gibi daha spesifik bir ifade.

Fread düzgün çalışması için regex etkileyen olması ile ne kadar okunan olabilir mi?

Evet. Topakları Okuma oldukça güvenilmez: a '[indir]' hattı bir yığın sınırı üzerinde bölünmüş ise, bu maç olmaz ve kaybolur. Ya yapabilirsiniz:

  • bakım, ya da değil
  • kerede bütün giriş okumak, ya da
  • gerçekten orada giriş newlines (genellikle vardır) eğer hat-tabanlı okuma kullanın
  • (n bulundu final maçı sonunda endeksi) girdi son n karakterini koruyarak ve ona yeni gelen girişi ekleyerek elle tampon yönetmek.

Sunucu farklılıklar gelince, aklıma tek şey sunuculardan biri, Windows ve bir * ix ise, onlar neden olabilir, bir satır ne farklı fikirleri var olacaktır "Orada newlines ya da değil mi?" karışıklık.