Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wiele wyrażeń regularnych najlepsze rozwiązanie
Forum PHP.pl > Forum > PHP
andrzejb
mam taki ciąg z ktorego pogrubione dane, chcialbym wyprowadzic jak najbardziej efektywnie do tablicy

  1. <?php
  2. $txt="Input #0, avi, from 'lolly.avi':
  3. Duration: 00:00:24.9, start: 0.000000, bitrate: 331 kb/s
  4. Stream #0.0: Video: mpeg4400x32025.00 fps
  5. Stream #0.1: Audio: pcm_u88000 Hz, mono64 kb/s
  6. Must supply at least one output file";
  7. ?>


zaczynam od Duration:
  1. <?php
  2. preg_match('/Duration:(.*?:)+/',$txt, $matches);
  3. print_r($matches);
  4.  
  5. $info['mov']['duration']=$matches[0];
  6.  
  7. Array ( [0] => Duration: 00:00:24.9, start: 0.000000, bitrate: [1] => 0.000000, bitrate: ) 
  8.  
  9. ?>


gdzie robie blad ?
FiDO
Przede wszystkim blad popelniasz stawiajac plusa za nawiasem. Powoduje to, ze podciag zostaje dopasowany wielokrotnie, ale zwracane jest tylko ostatnie dopasowanie (bitrate).

Jesli chodzi o najmniejsza mozliwa ilosc linijek (co najczesciej przeklada sie na efektywnosc) do wyciagniecia wszystkiego to moj pomysl jest taki:
  1. <?php
  2.  
  3. preg_match_all('#(?:(Duration|start|bitrate): (?P<wartosc>.*?)(?=,|r?n))|(?:(Video|Audio): (?P<av>.*?)(?=r?n))#',$txt, $matches, PREG_SET_ORDER);
  4.  
  5. $info['mov'] = array(
  6. 'duration' => $matches[0]['wartosc'],
  7. 'start' => $matches[1]['wartosc'],
  8. 'bitrate' => $matches[2]['wartosc'],
  9. 'video' => explode(', ', $matches[3]['av']),
  10. 'audio' => explode(', ', $matches[4]['av']),
  11. );
  12.  
  13. print_r($info);
  14.  
  15. ?>

Jak masz pytania dlaczego tak to smialo. Tylko najlepiej wycinaj konkretne kawalki wyrazenia i o nie pytaj.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.