Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyrażenia Regularne problem
buker
post 4.12.2011, 18:32:38
Post #1





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 8.01.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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_-]
Go to the top of the page
+Quote Post
kamil4u
post 4.12.2011, 19:06:24
Post #2





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
daniel1302
post 4.12.2011, 21:04:00
Post #3





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


  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] =>
)

)


Ten post edytował daniel1302 4.12.2011, 21:04:27
Go to the top of the page
+Quote Post
abort
post 4.12.2011, 23:46:56
Post #4





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
buker
post 5.12.2011, 12:10:41
Post #5





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 8.01.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 00:47