Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenia Regularne problem
Forum PHP.pl > Forum > PHP
buker
Witam mam problem z wyrażeniami regularnymi.
  1. /dev/sda1 93868 21959 67141 25% /
  2. /dev/sda6 197195 116541 70637 63% /media/Dane
  3. ...


Mam taki tekst z tym że tych wierszy może być dużo więcej.

Musze się dobrać do pierwszej i 2 wartości w każdym wierszu i je zsumować(pierwsza wartość pierwszy wiersz + pierwsza wartość 2 wiersz .... i tak dalej.)

Nie zbyt rozumiem wyrażenia regularne i prosił bym o pomoc.
/dev/(zamiast sda1 może być wiele rożnych rzeczy) tak samo na końcu /medi/Dande nie koniecznie musi być takie, zawsze będzie się zaczynać od "/")
Myślę nad czymś takim ale trochę się pogubiłem ;/
  1. $disktotal = preg_replace('^(/dev/)([A-Z0-9][A-Z)-9_-]
kamil4u
Tu chyba nie potrzeba wyrażenia regularnego. Nie robiłem żadnych testów, ale chyba szybsze będzie rozbicie wiersza(explode), po spacjach czy tabulatorach. Zrobisz to w pętli, a następnie dodasz wszystkie wartości. Ew. możesz użyć innej funkcji operującej na ciągach - upewnij się czy jakaś Ci się nie przyda( dawno nie korzystałem z nich, więc dobrze nie pamiętam ). Jeżeli uważasz, że to złe podejście to napisz dlaczego to wtedy pomyślimy nad wyrażeniem smile.gif

Pozdrawiam
daniel1302
  1. <?php
  2. $text =
  3. "/dev/sda6 197195 116541 70637 63% /media/Dane
  4. /dev/sda1 93868 21959 67141 25% /";
  5. //Dzieli tekst co linike;
  6. $text = preg_split('/\n/', $text);
  7. $pattern = '/^\/{1}(.*)?\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+\%{1})\s+\/{1}(.*)?$/';
  8.  
  9.  
  10. $matches = array();
  11. //Sprawdź każdą linikę
  12. foreach ($text as $value)
  13. {
  14. preg_match($pattern, $value, $match);
  15. $matches[] = $match;
  16. }
  17. echo '<pre>';
  18. print_r($matches);
  19. echo '</pre>';

I zwraca ci to taki wynik

Cytat
Array
(
[0] => Array
(
[0] => /dev/sda6 197195 116541 70637 63% /media/Dane
[1] => dev/sda6
[2] => 197195
[3] => 116541
[4] => 70637
[5] => 63%
[6] => media/Dane
)

[1] => Array
(
[0] => /dev/sda1 93868 21959 67141 25% /
[1] => dev/sda1
[2] => 93868
[3] => 21959
[4] => 67141
[5] => 25%
[6] =>
)

)
abort
Przeorganizowałbym nieco:
  1. $pattern = '/^(\/{1}.*)?\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\%{1}\s+(\/{1}.*)?$/';

Zalety:
- filesystem jest podany wprost z początkowym "/", analogicznie miejsce zamontowania filesystemu też - nie trzeba doklejać "/" przy wyświetlaniu, bierzemy dane wprost z tablicy
- procentowa zajętość danego systemu plików może być użyta w wyrażeniach arytmetycznych bez dodatkowych operacji na ciągach znaków (brak doklejonego "%" w ciągu znaków).
buker
  1. $text = trim(shell_exec("df -m | sed -n '/^[:cntrl:/]dev/p'"));
  2. //Dzieli tekst co linike;
  3. $text = preg_split('/\n/', $text);
  4. $pattern = '/^(\/{1}.*)?\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\%{1}\s+(\/{1}.*)?$/';
  5.  
  6.  
  7. $matches = array();
  8. //Sprawdź każdą linikę
  9. foreach ($text as $value)
  10. {
  11. preg_match($pattern, $value, $match);
  12. $matches[] = $match;
  13. }
  14. //echo '<pre>';
  15. //print_r($matches);
  16. //echo '</pre>';
  17. $disktotal = 0;
  18. $diskusage = 0;
  19. $diskfree = 0;
  20. $diskpercent = 0;
  21. $count = count($matches);
  22. for($i = 0; $i<$count;$i++)
  23. {
  24. $disktotal += $matches[$i][2];
  25. $diskusage += $matches[$i][3];
  26. $diskfree += $matches[$i][4];
  27. $diskpercent += $matches[$i][5];
  28. }
  29. echo "\n".$disktotal."\n";
  30. echo $diskusage."\n";
  31. echo $diskfree."\n";
  32. echo $diskpercent."\n";


Dziękuję wszystkim za pomoc.
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.