Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: php jak pobrać z tabelki drugie <td> </td>?
Forum PHP.pl > Forum > PHP
arekgr
Witam

Próbuję wyciągnąć z tabelki dane za pomocą regexp .
Sytuacja następująca w pierwszym <td> </td> jest znane -stałe słowo "dane"
chcę wyciągnąć znaki zawierające sie w następnym <td></td> znaki to losowe słowa a-Z i 0-9 potrzebne do pracy.

ten kod pobiera prawie dobrze tylko nie kończy na następnej pozycji, drugim td, tylko przerabia caly dokument do konca , jak go poprawić ?

/dane(.*)<\/td>/si


Arek
Crozin
.* -> .*?

Poczytaj o tzw. zachłanności w wyrażeniach regularnych
arekgr
To nie pomaga za szybko się konczy, juz na kodzie <td>dane</td> i dalej nie czyta

/dane(.*?)<\/td>/si
Crozin
No to dodaj jeszcze do wyrażenia by odczytało i następne <td>...</td>
arekgr
w ten sposóbo pobiera za dużo ..

/dane(.*?)<\/td><td(.*?)><\/td>/si

jak to zrobić ? żeby pobralo zawartość z <td>dane</td> i drugiego <td>szukane !</td>
Crozin
W tym drugim to chyba chciałeś: <td>(.*?)</td>, a nie to co napisałeś... winksmiley.jpg
arekgr
poprawilem tak jak pisałeś i dodalem \s+ bo nic sie nie pojawilo ale i tak za duzo pobiera dodatkowe <td> ,a bez \s+ nic nie
pobiera ...

/dane(.*?)<\/td>\s+<td>(.*?)<\/td>/si
Crozin
  1. <pre><?php
  2.  
  3. $content = <<<EOT
  4. <table>
  5. <tr>
  6. <td>bla bla dane bla bla</td>
  7. <td>xxx 1</td>
  8. <td>yyy</td>
  9. <td>zzz</td>
  10. </tr>
  11. <tr>
  12. <td>bla bla bla bla</td>
  13. <td>xxx</td>
  14. <td>yyy</td>
  15. <td>zzz</td>
  16. </tr>
  17. <tr>
  18. <td>bla bla dane bla bla</td>
  19. <td>xxx 2</td>
  20. <td>yyy</td>
  21. <td>zzz</td>
  22. </tr>
  23. <tr>
  24. <td>bla bla bla bla</td>
  25. <td>xxx</td>
  26. <td>yyy</td>
  27. <td>zzz</td>
  28. </tr>
  29. </table>
  30. EOT;
  31.  
  32. preg_match_all('#<td>.*?dane.*?</td>.*?<td>(.*?)</td>#is', $content, $result);
  33.  
  34. print_r($result[1]);
Sprawdzone - działa.
arekgr
Dzieki za kod ale ten co podałeś również pobiera wszystkie dane pomiedzy tagami <td> a mi chodzilo o tag z słowem Dane i następny po nim, moja tabelka ma sporo wiecej tych zbytecznych td ...
Crozin
Tamten kod zwraca Ci wszystkie znalezione: <td>...dane...</td><td>...</td> (indeks zero tablicy $result)
Oraz wszystkie <td>...</td> wystąpujące zaraz po TD z "dane" (indeks 1 tablicy $result)
arekgr
Właśnie działa dobrze , ale mi chodziło tylko o zawartość tylko jednego tagu <td> tuż po <td> danych </td>
zegarek84
to jaki problem teraz z tej tablicy pobrać gotową wartość??
tutaj też masz gotową odpowiedź ale nie na wyrażeniach regularnych lecz DOM:
  1. $content = <<<EOT
  2. <table>
  3. <tr>
  4. <td>bla bla dane bla bla</td>
  5. <td>xxx 1</td>
  6. <td>yyy</td>
  7. <td>zzz</td>
  8. </tr>
  9. <tr>
  10. <td>bla bla bla bla</td>
  11. <td>xxx</td>
  12. <td>yyy</td>
  13. <td>zzz</td>
  14. </tr>
  15. <tr>
  16. <td>bla bla dane bla bla</td>
  17. <td>xxx 2</td>
  18. <td>yyy</td>
  19. <td>zzz</td>
  20. </tr>
  21. <tr>
  22. <td>bla bla bla bla</td>
  23. <td>xxx</td>
  24. <td>yyy</td>
  25. <td>zzz</td>
  26. </tr>
  27. </table>
  28. EOT;
  29.  
  30. $doc = new DOMDocument();
  31. $doc->loadHTML($content);
  32. echo $doc->getElementsByTagName('td')->item(1)->nodeValue;
  33. // lub echo $doc->getElementsByTagName('td')->item(1)->textContent;
wry
a jesli sie upierasz przy wyrazeniu regularnym to przelacznik U bedzie nieodzowny

  1. '/dane.*<\/td>\s+<td>(.*)<\/td>/Usi'
arekgr
Witam dziękuje za zainteresowanie i kilka nowych odpowiedzi , w dalszym ciągu regexp w takiej postaci nie wydziela prawidlowo danych

preg_match_all("/Lokalizacja.*<\/td>\s+<td>(.*)<\/td>/Usi",$curl_result, $out PREG_SET_ORDER);

może faktycznie zrobić to na dom..

Arek G

dziękuje wszystkim ślicznie !
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.