Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] wyrażenie regularne wyodrębniające liczbę, spomiędzy tagów html
-Michał Ziółkowski-
post 11.04.2011, 22:23:28
Post #1





Goście







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.

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
-krzotr-
post 11.04.2011, 23:03:52
Post #2





Goście







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. )*/
Go to the top of the page
+Quote Post
-Michał Ziółkowski-
post 12.04.2011, 11:30:50
Post #3





Goście







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.
Go to the top of the page
+Quote Post
-Michał Ziółkowski-
post 12.04.2011, 21:38:17
Post #4





Goście







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.
Go to the top of the page
+Quote Post
-krzotr-
post 12.04.2011, 22:21:21
Post #5





Goście







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

Ten post edytował krzotr 12.04.2011, 22:23:21
Go to the top of the page
+Quote Post
egdstudio
post 19.04.2011, 12:00:38
Post #6





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 18.01.2009

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


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:
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 - 11:24