Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]preg_match_all
Forum PHP.pl > Forum > Przedszkole
MiChaSSs
Hej,
Pisze skrypt ktory ma pobierac dane ze strony gpw.pl Chce aby ze strony glownej pobieral on np. informacje odnosnie WIG-u 20 (precentowa zmiane oraz aktualna liczbe punktow). Napsisalem cos takiego:

  1. <?php
  2. $stock_data = 'WIG20+0.42%1 808.6816:40';
  3.  
  4. if(preg_match_all('@WIG20<[^>]+>(([0-9.%+-s]+))+@', $stock_data, $found_data))
  5. {
  6.    print_r($found_data);
  7.  
  8. }
  9. ?>


i dostaje cos takiego:

  1. <?php
  2. (
  3.    [0] => Array
  4.        (
  5.            [0] => WIG20[img]images/witryna_wskaznik_plus.gif[/img]+0.42%1 808.68
  6.        )
  7.  
  8.    [1] => Array
  9.        (
  10.            [0] => 1 808.68
  11.        )
  12.  
  13.    [2] => Array
  14.        (
  15.            [0] => 1 808.68
  16.        )
  17.  
  18. )
  19. ?>


a chcialbym otrzymywac cos takiego:

  1. <?php
  2. (
  3.    [0] => Array
  4.        (
  5.             [0] => WIG20[img]images/witryna_wskaznik_plus.gif[/img]+0.42%1 808.68
  6.        )
  7.  
  8.    [1] => Array
  9.        (
  10.            [0] => 1 808.68
  11.            [1] => +0.42%
  12.        )
  13.  
  14.    [2] => Array
  15.        (
  16.            [0] => 1 808.68
  17.            [1] => +0.42%
  18.        )
  19. )
  20. ?>


najbardziej zalezy mi na tablicy [2][..], reszta moze nie istniec. Gdzie robie blad? W zmiennej $stock_data jest kod html-a, ktory generuje strona (na stronie sa jeszcze znaki nowej linii .... btw. jak to uwzglednic?). Dziekuje za pomoc, pozdrawiam Michal
Wicepsik
  1. <?php
  2. $strona = file_get_contents('http://gpw.pl/');
  3. preg_match_all('/<td class="indeksy_nazwa">WIG20</td>[^<]*?<td width="80" align="center"><img src=images/witryna_wskaznik_plus.gif></td>[^<]*?<td width="60" class="indeksy_wart" align="right">(.*)</td>[^<]*?<td width="80" class="indeksy_wart" align="right">(.*)</td>/', $strona, $matches);
  4. echo '<pre>';
  5. print_r($matches);
  6. ?>

Kod
Array
(
    [0] => Array
        (
            [0] => WIG20

+0.42%
1 808.68
        )

    [1] => Array
        (
            [0] => +0.42%
        )

    [2] => Array
        (
            [0] => 1 808.68
        )

)

Masz dwie wartości. Moim zdaniem lepiej samemu sformatować potem te wartości.
MiChaSSs
dziekuje, dokladnie o cos takiego mi chodzilo, ale chcialem jeszcze zapytac o jedna rzecz. Poniewaz linie w html-u

  1. <?php
  2. <td width="60" class="indeksy_wart" align="right">(.*)</td> <--- odpowiedzialna za wartosc procentowa
  3. <td width="80" class="indeksy_wart" align="right">(.*)</td> <--- odpowiedzialna za wartosc w punktach
  4. ?>


sa praktycznie identycznie, to czy nie mozna w funkcji preg_match_all zapisac odpowiedniego wzoru (cos na taki wzor jak to zrobilem wczesniej) zeby odszukiwal te linie i wrzucal do tablicy odpowiednie wartosci?
Wicepsik
  1. <?php
  2. $strona = file_get_contents('http://gpw.pl/');
  3. preg_match('/<td width="60" class="indeksy_wart" align="right">(.*)</td>/', $strona, $procent);
  4. preg_match('/<td width="80" class="indeksy_wart" align="right">(.*)</td>/', $strona, $liczba);
  5. echo '<pre>';
  6. print_r($procent);
  7. print_r($liczba);
  8. ?>


  1. Array
  2. (
  3. [0] => <td width="60" class="indeksy_wart" align="right">+0.42%</td>
  4. [1] => +0.42%
  5. )
  6. Array
  7. (
  8. [0] => <td width="80" class="indeksy_wart" align="right">1 808.68</td>
  9. [1] => 1 808.68
  10. )
MiChaSSs
hehe smile.gif nie no wiadomo, myslalem poprostu ze da sie to zalatwic jednym wzorem do preg_match (w sensie jednym wywolaniem preg_match). A i jeszcze jedno, rozumiem, ze wyrazenie [^<]*? jest odpowiedzialne za znak nowej linii. [^<] oznacza ze moze byc wszystko poza znakiem < pozniej gwiazdka oznacza ze moze byc tego nieskonczenie duzo a pozniej pytajnik ze to moze wystepowac raz lub wcale? Nie rozumiem tego, moglbys mi to wytlumaczyc?
Wicepsik
Kiedyś dostałem skrypt od kolegi z wyrażeniami i jakoś tak zostało. Można to zrobić w jednym zapytaniu.
  1. <?php
  2. $strona = file_get_contents('http://gpw.pl/');
  3. preg_match('/<td width="60" class="indeksy_wart" align="right">(.*)</td>[^<]<td width="80" class="indeksy_wart" align="right">(.*)</td>/', $strona, $liczba);
  4. echo '<pre>';
  5. print_r($liczba);
  6. ?>

Jeżeli o to chodzi.
erix
Proszę o tag tematu.
MiChaSSs
Nie do konca mialem to na mysli. Chodzilo mi o to, zeby wzor do:

  1. <?php
  2. <td width="80" class="indeksy_wart" align="right">1 808.68</td>
  3. i
  4. <td width="60" class="indeksy_wart" align="right">+0.42%</td>
  5. ?>



byl uzyty tylko raz w preg_match_all a pozniej zeby dodac + pod koniec wyrazenia, cos na wzor tego co napisalem w 1. poscie:

Cytat
if(preg_match_all('@<td class="indeksy_nazwa">WIG20</td><td width="[0-9]+" align="[a-zA-Z]+"><[^>]+></td>(<td width="[0-9]+" class="indeksy_wart" align="[a-zA-Z]+">([0-9.%+-\s]+)</td>)+@', $stock_data, $found_data))
{
print_r($found_data);

}


tylko dzialajace tongue.gif ale jesli sie nie da to uzyje tej metody co Ty (bo tez jest dobra). Prosilbym Cie tylko o wytlumaczenie mi tego [^<]*? bo nie czaje jak moze byc * i ? obok siebie . Dokladnie opisalem problem w moim poscie wyzej smile.gif


-----

erix -> tag dodany, przepraszam zapomnialem smile.gif
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.