Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z preg_match()
Forum PHP.pl > Forum > Przedszkole
krzychu0808
Witam...
Wiem że ten temat był już 100 razy wałkowany na forum ale przeszukałem forum (Szukaj: preg_match) i rozwiązania nie znalazłem.

Pobieram przez CURL treść strony i chcę wyciągnąć poziom postaci. Pobrana treść wygląda tak(użyłem htmlspecialchars przy wyświetlaniu wyniku curl):
.....
</tr> <tr style='background:#DDDDDD;'> <td>Poziom</td> <td align='right'>3</td> </tr> <tr style='background:#BBBBBB;'> <td>Doświadczenie</td> <td align='right'>16/40</td> </tr>
......

i chcę wyświetlić poziom postaci napisałem coś takiego:
  1. .....
  2. $page = curl_exec($c);
  3. curl_close($c);
  4. preg_match("|<td>Poziom</td> <td align='right'>(.+)</td>|",$page,$test);
  5. echo $test[1];


Niestety dostaję pusty wynik ale jak zrobiłem
  1. .....
  2. $page = curl_exec($c);
  3. curl_close($c);
  4. preg_match("|<td align='right'>(.+)</td>|",$page,$test);
  5. echo $test[1];

To mi wyświetla pierwszą napotkaną zawartość <td align='right'> a mi chodzi nie o pierwszą tylko o tą gdzie jest poziom.

Dziękuję i pozdrawiam
webdice
Kod
|<td>Poziom</td> <td align='right'>([^<]+)</td>|s
krzychu0808
Niestety nic się nie wyświetla.

Całość Kodu:
  1. $c = curl_init();
  2. curl_setopt($c, CURLOPT_URL, "strona");
  3. curl_setopt($c, CURLOPT_HEADER , 0);
  4. curl_setopt($c, CURLOPT_NOBODY , 0);
  5. curl_setopt($c, CURLOPT_RETURNTRANSFER , 1);
  6. curl_setopt($c, CURLOPT_COOKIEFILE, './cookie.txt');
  7. curl_setopt($c, CURLOPT_COOKIEJAR,'./cookie.txt');
  8. $page = curl_exec($c);
  9. curl_close($c);
  10. preg_match("|<td>Poziom</td> <td align='right'>([^<]+)</td>|s",$page,$test);
  11. echo $test[1]; // wyświetlenie wyniku preg_match
  12. echo '<br/><br/><br/>';
  13. echo htmlspecialchars($page); // tutaj wyświetlam sobie cały kod pobrany


echo htmlspecialchars($page); wyświetla cały kod więc pobiera dane, ale wyniku echo $test[1]; nie ma.
webdice
Na ślepo mogę sobie próbować.

  1. file_put_contents( 'file.txt', $page );


Wrzuć gdzieś plik i podaj adres.
krzychu0808
Proszę: http://game.pcspace.pl/curl/file.txt
prawie na samym końcu zresztą szukajką znajdziesz. I nie śmiej się tylko z treści bo wziołem pierwszą lepszą grę bez anty bota aby się podszkolić.

Ale chyba znalazłem problem bo zrobiłem coś takiego:
  1. $page= "</tr> <tr style='background:#DDDDDD;'> <td>Poziom</td> <td align='right'>3</td> </tr> <tr style='background:#BBBBBB;'> <td>Doświadczenie</td> <td align='right'>16/40</td> </tr>";
  2. preg_match("|<td>Poziom</td> <td align='right'>([^<]+)</td>|s",$page,$test);
  3. echo $test[1];

i działa ale jak wrzuciłem do txt jak kazałeś to tam jest nie:
<td>Poziom</td> <td align='right'>3</td>
tylko
<td>Poziom</td>
<td align='right'>3</td>
nie jest obok siebie tylko linijkę niżej jest jedno.

Jakiś pomysł ?
greycoffey
Kod
/<td>Poziom<\/td>.*?<td align='right'>([0-9]+?)<\/td>/s
webdice
Kod
|<td>Poziom</td>\s+<td align='right'>([^<]+)</td>|


lub jeśli poziom jest zawsze liczbą to:

Kod
|<td>Poziom</td>\s+<td align='right'>([0-9]+)</td>|
krzychu0808
Ok działa pięknie a jak teraz zrobić aby za jednym razem wyciągnąć parę rzeczy np.

  1. preg_match("|<td>Poziom</td>\s+<td align='right'>([^<]+)</td>|",$page,$test);
  2. echo "Poziom: ".$test[1];
  3. preg_match("|<td>Doświadczenie</td>\s+<td align='right'>([^<]+)</td>|",$page,$test);
  4. echo "<br/>Doświadczenie: ".$test[1];


Jak to zapisać w jednym preg_match aby było $test[1];, $test[2];... aby nie robić tego samego 10 razy tylko poklei jak jest w kodzie, tak sformułować i wyciągać to.
I co oznacza \s+ ?
webdice
Kod
|<td>([^<]+)</td>\s+<td align='right'>([^<]+)</td>|


Zwróci Ci tablicę z między innymi klucze z nazwą i wartością. Możesz również wrzucić większą ilość kodu, np:

Kod
|<td>Poziom</td>\s+<td align='right'>([^<]+)</td>(.*)<td>Doświadczenie</td>\s+<td align='right'>([^<]+)</td>|
krzychu0808
No właśnie też tak kombinowałem ale jest problem bo
Kod
|<td>([^<]+)</td>\s+<td align='right'>([^<]+)</td>|

Wyświetla tylko test[1] i test[2] a dalej tablica jest pusta ;/

a
Kod
|<td>Poziom</td>\s+<td align='right'>([^<]+)</td>(.*)<td>Doświadczenie</td>\s+<td align='right'>([^<]+)</td>|

Coś nie działa, zwraca pustą tablice, bo już tak też kombinowałem i coś nie działało i dlatego spytałem o tą postać.

To wyświetla: W dziczy spotkałeś , więc coś się zatrzymuje na tych <b></b>.
webdice
1. Użyj preg_match_all.
2. Poczytaj o wyrażeniach regularnych, nie czekaj na gotowe.
krzychu0808
Ok poczytałem o wyrażeniach regularnych i już wiem co i jak ale mam teraz inny problem.
Napisałem sobie dla testów coś takiego:
  1. <?
  2. $page="asdasd asdasdasd asdasdasdas affdgdfdg
  3. sfsf
  4. <p class='note'>W dziczy spotkałeś <b>ABC</b> staje do walki broniąc swojego terytorium.</p><br class='clear'><center><a href='#wynik'>Przejdź do wyniku walki</a></center>
  5. <h2>Przebieg Walki</h2> <table width='100%' cellspacing='0' style='border: solid 1px #555555;'>
  6. <p>W dziczy spotkałeś <b>ABC</b> staje do walki broniąc swojego terytorium.</p><br class='clear'><center><a href='#wynik'>Przejdź do wyniku walki</a></center>
  7. <tr>
  8. aaaa</br>
  9. sfffs</br>
  10. dupa";
  11.  
  12. preg_match("|<p class='note'>([\D\d]+)</p>|",$page,$test);
  13. echo $test[1];
  14. ?>

I chciałem wyświetlić zawartość tylko pomiędzy pierwszym <p class='note'> a </p> a program wyświetla mi całość od <p class='note'> do ostatniego </p> w tekście. Jeżeli zmienię "<p>W dziczy spotkałeś...</p>" na <b>...</b> to pokazuje dobrze, nie wiem czemu się nie zatrzymuje.

Program wyświetla:
Kod
W dziczy spotkałeś ABC staje do walki broniąc swojego terytorium.

PrzejdĹş do wyniku walki
Przebieg Walki

W dziczy spotkałeś ABC staje do walki broniąc swojego terytorium.
webdice
Kod
|<p class='note'>([\D\d]+?)</p>|


Poczytaj o zachłanności.
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.