Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Curl i preg_match_all
Forum PHP.pl > Forum > PHP
Ziem
Witam!
Mój problem polega na tym, że nie potrafię uzyskać interesujących mnie danych ze strony, którą pobieram cURL'em.

Strona wygląda tak (jest tam bardzo dużo tabel z różnymi atrybutami i bez, itp.; wybrałem to, co najważniejsze):
  1. ...
  2. <tr>
  3. <td>...</td>
  4. ...
  5. <tr>
  6. ...
  7. <table class="innaklasa" cellpadding="0" cellspacing="0">
  8.  
  9. <tr>
  10. <td>wart1</td>
  11. <td class="klasa1">wart2</td>
  12. <td class="klasa2">wart3</td>
  13. </tr>
  14.  
  15. <tr>
  16. <td>wart11</td>
  17. <td class="klasa1">wart12</td>
  18. <td class="klasa2">wart13</td>
  19. </tr>
  20.  
  21. <tr>
  22. <td>wart21</td>
  23. <td class="klasa1">wart22</td>
  24. <td class="klasa2">wart23</td>
  25. </tr>
  26. ...
  27. </table>
  28. ...
  29. <table class="jakasklasa">
  30.  
  31. <tr>
  32. <td>wart1</td>
  33. <td class="klasa1">wart2</td>
  34. <td class="klasa2">wart3</td>
  35. </tr>
  36.  
  37. <tr>
  38. <td>wart11</td>
  39. <td class="klasa1">wart12</td>
  40. <td class="klasa2">wart137</td>
  41. </tr>
  42.  
  43. <tr>
  44. <td>wart21</td>
  45. <td class="klasa1">wart22</td>
  46. <td class="klasa2">wart23</td>
  47. </tr>
  48. ...
  49. ...

Potrzebuję dobrać się do danych z tabeli <table class="innaklasa" cellpadding="0" cellspacing="0"> i zapisać je do tablicy.

Próbuję robić tak:
1.
  1. preg_match_all('/<table class="innaklasa" cellpadding="0" cellspacing="0">\s.?<tr>\s.?<td>(.*?)<\/td>\s+?<td class="klasa1">(.*?)<\/td>\s+?<td class="klasa2">(.*?)<\/td>\s.?<\/tr>\s.?/si', $result, $matches);

Zwraca mi tylko pierwszy rekord...

2.
  1. preg_match_all('/<tr>\s.?<td>(.*?)<\/td>\s+?<td class="klasa1">(.*?)<\/td>\s+?<td class="klasa2">(.*?)<\/td>\s.?<\/tr>\s.?/si', $result, $matches);

Wyniki ładnie zwraca, tylko do początku tablicy dopisuje pół strony...

Co powinienem zrobić, aby pobrać te dane?

Pozdrawiam!
marcinpruciak
Może tak:

  1. preg_match_all("/(<td.*>)(\w.*)(<\/td>)/",$file,$patterns);


Pobierze to wszystkie wiersze tabeli, ale możesz dopisać do tego class:

  1. preg_match_all("/(<td class"jakas klasa" >)(\w.*)(<\/td>)/",$file,$patterns);


Powinno zadziałac.

zegarek84
może tak?? - nie może tak bo źle - nie muszę sprawdzać żeby widzieć że źle...

wielu się uparło na wyrażenia regularne i choć często w tej tematyce dawałem gotowce to stwierdzę że nie da się tego wytłumaczyć - a jednocześnie stwierdzę, że dostępne w necie kursy z wyrażeniami są wystarczające - akurat chyba najlepsze pod javascript...

ale też jednocześnie tylko wystarczy pojąć jak załadować dokument do zmiennej żeby operować na nim jak w js na DOM (jest też dodatek prawie jak w jquery ale jestem zwolennikiem podstaw i takie rzeczy i tak prosto się wyszukuje..)

tutaj gotowca z wyrażeń regularnych nie podam a zalecam zapoznanie się z DOM w php - jeśli będę widział jakiekolwiek pruby - ale sensowne a nie tylko klepnąć na forum byle jaki kod - to jak będzie kod z podjętymi próbami to jutro mogę pomóc - tutaj tylko trzeba wiedzieć jak wczytać dokument - jak podstawy tu zrozumie się to nie będzie takich dylematów przy parsowaniu źródeł jak z wyrażeniami regularnymi - wyrażeniom regularnym pozostawmy raczej sprawdzanie poprawnych danych winksmiley.jpg
Ziem
Dzięki za odpowiedź!
Niestety, nie o to mi chodziło.

Twoje propozycje pobierają dane ze wszystkich tabel, albo tylko z określonych komórek (z atrybutem class).

Może spróbuję dokładniej wytłumaczyćo co mi chodzi.
Strona zbudowana jest z wielu tabel(jedne z atrybutami, inne bez...), ja chciałbym pobrać serię danych dokładnie z tabeli
  1. <table class="innaklasa" cellpadding="0" cellspacing="0">

Czyli interesujące mnie serie wartości to:
wart1
wart2
wart3

wart11
wart12
wart13

wart21
wart22
wart23
...

Czy da się je jakoś jednorazowo pobrać?

Pozdrawiam!
marcinpruciak
Musi być jednorazowo?
Możesz to zrobić na dwa razy.
1.
  1. preg_match_all("/(<table class="innaklasa" cellpadding="0" cellspacing="0" .*>)(\w.*)(<\/table>)/",$file,$patterns);


2.
  1. preg_match_all("/(<td.*>)(\w.*)(<\/td>)/",$pattenrs[0]/*lub[1]musisz sprawdzic*/ ,$patterns);
Ziem
Cytat(zegarek84 @ 11.08.2009, 21:43:52 ) *
może tak?? - nie może tak bo źle - nie muszę sprawdzać żeby widzieć że źle...

wielu się uparło na wyrażenia regularne i choć często w tej tematyce dawałem gotowce to stwierdzę że nie da się tego wytłumaczyć - a jednocześnie stwierdzę, że dostępne w necie kursy z wyrażeniami są wystarczające - akurat chyba najlepsze pod javascript...

ale też jednocześnie tylko wystarczy pojąć jak załadować dokument do zmiennej żeby operować na nim jak w js na DOM (jest też dodatek prawie jak w jquery ale jestem zwolennikiem podstaw i takie rzeczy i tak prosto się wyszukuje..)

tutaj gotowca z wyrażeń regularnych nie podam a zalecam zapoznanie się z DOM w php - jeśli będę widział jakiekolwiek pruby - ale sensowne a nie tylko klepnąć na forum byle jaki kod - to jak będzie kod z podjętymi próbami to jutro mogę pomóc - tutaj tylko trzeba wiedzieć jak wczytać dokument - jak podstawy tu zrozumie się to nie będzie takich dylematów przy parsowaniu źródeł jak z wyrażeniami regularnymi - wyrażeniom regularnym pozostawmy raczej sprawdzanie poprawnych danych winksmiley.jpg

Przepraszam, ale nie zauważyłem Twojej wypowiedzi.

Jestem początkującym i chwytam się pozornie najprostszych rozwiązań. Gdy szukałem informacji o cURL na forum to zauważyłem, że do "wydobycia" interesujących danych, różne osoby korzystały z preg_match_all, więc czemu ja też nie mogę? Napisałem kilka prostych skryptów używając cURL i preg_match_all spisywał się na medal. Ostatnio zamiast pomyśleć, usilnie próbowałem zmodyfikować wyrażenie regularne i nic z tego nie wyszło. Dzięki za dodatkowe materiały, w wolniej chwili do nich zajrzę.

Cytat(marcinpruciak @ 11.08.2009, 22:13:52 ) *
Musi być jednorazowo?
Możesz to zrobić na dwa razy.
...

Z tym jednorazowym to przesadziłem.
Właśnie o to mi chodziło, jakoś na to nie wpadłem blinksmiley.gif . Dzięki wielkie!

Pozdrawiam!
zegarek84
Cytat(Ziem @ 11.08.2009, 22:39:55 ) *
Jestem początkującym i chwytam się pozornie najprostszych rozwiązań. Gdy szukałem informacji o cURL na forum to zauważyłem, że do "wydobycia" interesujących danych, różne osoby korzystały z preg_match_all, więc czemu ja też nie mogę? Napisałem kilka prostych skryptów używając cURL i preg_match_all spisywał się na medal. Ostatnio zamiast pomyśleć, usilnie próbowałem zmodyfikować wyrażenie regularne i nic z tego nie wyszło. Dzięki za dodatkowe materiały, w wolniej chwili do nich zajrzę.

to forum nabrało ze względu na łatwość języka charakteru "forum dla początkujących programistów" (w większej mierze) [w większości przypadków wyrażenia regularne są wygodne a jeśli często je się używa to i łatwe do zrozumienia - ale tutorjal wcześniej pasuje przeczytać kilka razy jeśli go się nie rozumie i później próbować wg. niego robić gdyż w wyrażeniu regularnym gotowców jednak nie ma - je trzeba w końcu zrozumieć) - w wyrażeń regularnych już nieraz udzielałem gotowych odpowiedzi bo w sumie nie bardzo da się nakierować - z Twojej wypowiedzi wynika, że chcesz czegoś jeszcze się nauczyć - jeśli trochu "bawiłeś" się z js wiesz jak łatwo przeszukiwać DOM (jakieś algorytmy można już obmyśleć) - skorzystaj ze wskazówek i napisz w czym problem - jeśli napiszesz, że zrozumieć i jednocześnie że problemy na starcie to z DOM'em w php w pierw podam Ci start i tak stopniowo (i to się da nauczyć a wyrażenia regularne to jest powielanie toutoriali) - poruszanie po DOM jest wygodniejsze a jeśli chcesz uprzedzić to do czego kieruję a jednocześnie niby tego nie preferuję ale czemu furtkę zamykać to poszukaj jeszcze pod hasłem phpQuery (prawie jak jqueqry ale w php - ze względu na te gotowce raczej jestem zrażony ;p - chyż jak zrozumiesz to składnia krótsza i bardziej podpadająca pod składnię css)
Unik2psc
hm a moze explode ? tongue.gif (<table class="innaklasa" cellpadding="0" cellspacing="0">)
wiem ze prosty sposob smile.gif wyzej widzialem lepsze rozwiazanie.


// daruj sobie takie "wskazówki"
// wypowiedź całkowicie niezwiązana z tematem
// ayeo
zegarek84
proszę - jak już nakierowuję na "lepsze" (zawsze ktoś może napisać że jest jeszcze lepsze rozwiązanie) to proszę nie wprowadzaj w błąd - zaczyna się w stylu:
$tresc = new DOMDocument();
@$tresc->loadHTML($txt);

gdzie w źródle $txt najlepiej żeby było określone meta z kodowaniem i to za raz po <head> - ale to głównie dlatego że mieszasz ;p - ale do parsowania dokumentów lepiej się nauczyć dom pod php ;p
Ziem
Cytat(Unik2psc @ 11.08.2009, 23:13:07 ) *
hm a moze explode ? tongue.gif (<table class="innaklasa" cellpadding="0" cellspacing="0">)
wiem ze prosty sposob smile.gif wyzej widzialem lepsze rozwiazanie.

To jest też jakaś myśl biggrin.gif .

Cytat(zegarek84 @ 11.08.2009, 23:34:22 ) *
proszę - jak już nakierowuję na "lepsze" (zawsze ktoś może napisać że jest jeszcze lepsze rozwiązanie) to proszę nie wprowadzaj w błąd - zaczyna się w stylu:
$tresc = new DOMDocument();
@$tresc->loadHTML($txt);

gdzie w źródle $txt najlepiej żeby było określone meta z kodowaniem i to za raz po <head> - ale to głównie dlatego że mieszasz ;p - ale do parsowania dokumentów lepiej się nauczyć dom pod php ;p

Dzięki za naprowadzenie! Jeśli chodzi o moje doświadczenia, to z DOM spotykam się pierwszy raz, z js też nie miałem do czynienia. Bardzo chętnie nauczę się czegoś nowego, co ułatwi mi pewne rzeczy. Na początku nie wiedziałem z czym to się je... Jednak wczoraj trochę przeglądałem manual, a potem znalazłem to: Parse HTML with DOM i trochę się rozjaśniło. Tylko muszę bardziej się w to zagłębić, poczytać o podstawach, co i jak... Jakbyś miał jakiś ciekawy kurs/tutorial byłbym wdzięczny za linki.

Pozdrawiam!
erix
Hmm, jeśli masz opanowaną składnię jQuery, to zainteresuj się phpQuery - manipulacje SGML (XML/HTML/...) w praktycznie ten sam sposób, co jQ. ;]

Jeśli chodzi o wyciąganie danych, to chyba nie ma lepszego rozwiązania. ;]
Ziem
Cytat(erix @ 12.08.2009, 11:43:53 ) *
Hmm, jeśli masz opanowaną składnię jQuery, to zainteresuj się phpQuery - manipulacje SGML (XML/HTML/...) w praktycznie ten sam sposób, co jQ. ;]

Jeśli chodzi o wyciąganie danych, to chyba nie ma lepszego rozwiązania. ;]

Dzięki za informację!

Rzucacie mnie na głęboką wodę tongue.gif . jQuery jest mi też obce, widzę, że jeszcze dużo nauki przede mną...

Pozdrawiam!
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.