Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] wyrażenie regularne wyodrębniające liczbę
Forum PHP.pl > Forum > Przedszkole
Michał Ziółkowski
Witam, próbuje ułożyć wyrażenie regularne które pobierze tylko i wyłącznie numer 1.0.9 z poniższego kodu:
  1. <li>
  2. <strong>New version</strong> 1.0.9
  3. </li>

Pobieram dane z innej strony za pomocą funkcji file_get_contents(), a do wyodrębniania numeru próbowałem użyć preg_match(), jednak problemem jest chyba do, że po 1.0.9 a przed </li> jest przejście do nowej lini.

krzotr
Przykładowo możesz tak:

  1. <?php
  2.  
  3. $str = '<li>
  4. <strong>New version</strong> 1.0.9
  5. </li>';
  6.  
  7. preg_match( '~<li>\s+<strong>.+?</strong> ([^\r\n ]+)\s+</li>~', $str, $m );
  8.  
  9. print_r( $m );
  10.  
  11. /*
  12. Array
  13. (
  14.   [0] => <li>
  15.   <strong>New version</strong> 1.0.9
  16. </li>
  17.   [1] => 1.0.9
  18. )*/
Michał Ziółkowski
Dziękuje serdecznie, działa jak należy co prawda kod wygląda tak:
  1. <li>
  2. <strong>Version</strong> x.x.x
  3. </li>

Nie rozumiem tylko czemu pobiera akurat dane z pozycji "Version" a jest ich trochę więcej, m.in.
  1. <li>
  2. <strong>Last updated</strong> data
  3. </li>
  4.  
  5. <li>
  6. <strong>MD5 checksum</strong> md5
  7. </li>
  8.  
  9. <li>
  10. <strong>Total Downloads</strong> x
  11. </li>

Oczywiście po zmianie Twojego kodu na:
  1. preg_match( '~<li>\s+<strong>Total Downloads</strong> ([^\r\n ]+)\s+</li>~', $str, $m );

Wyświetla dane z pozycji Total Downloads, może jest to spowodowane tym, że Version jest pierwszą pozycją która jako dane zawiera liczby?

Druga sprawa, próbowałem przerobić kod, który napisałeś tak aby wyświetlał liczbę takiego kodu:
  1. <tr>
  2. <td>Downloads:</td>
  3. <td>116</td>
  4. </tr>

postępowałem analogicznie i storzyłem coś takiego:
  1. preg_match( '~<tr>\s+<td>Downloads:</td>\s+<td> ([^\r\n ]+)</td>\s+</tr>~', $str, $m );
ale nie działa.
Proszę o pomoc i pozdrawiam.
Michał Ziółkowski
Nie mam pojęcia jak to zrobić, próbowałem tak:
  1. preg_match( '~<td>Downloads:</td>\s+ <td>([^\r\n ]+)</td>~', $str, $m );

lecz też nie działa. Proszę o pomoc.
krzotr
Wcześniejsze wyrażenie miałeś prawie dobrze
  1. preg_match( '~<tr>\s+<td>Downloads:</td>\s+<td> ([^\r\n ]+)</td>\s+</tr>~', $str, $m );


Kod
<td> ([^\r\n ]+)</td>

Powinno być
Kod
<td>([^\r\n ]+)</td>

bez spacji za tagiem "<td>"

Wracając do poprzedniego

  1. <?php
  2.  
  3. $str = '<li>
  4. <strong>Last updated</strong> data
  5. </li>
  6.  
  7. <li>
  8. <strong>MD5 checksum</strong> md5
  9. </li>
  10.  
  11. <li>
  12. <strong>Total Downloads</strong> x
  13. </li>';
  14.  
  15. preg_match_all( '~<li>\s+<strong>.+?</strong> ([^\r\n ]+)\s+</li>~', $str, $m );
  16.  
  17. print_r( $m );


Za pomocą funkcji preg_match_all otrzymasz wszystkie wyrażenia pasujące do danego wzorca.

Co oznaczają [[^\r\n ]], .+?, (.+?) itp znajdziesz pod hasłem "Wyrażenia regularne" smile.gif
egdstudio
witam

a jak zmodyfikowac aby ta fukcja odrzucala wszystko co jest przed ( i po )?

np z takiego ciagu:

150 x 100 cm (+100,00zł) razem:
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.