Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: preg_match i wydobycie tabeli z kodu html
Forum PHP.pl > Forum > PHP
Grzesiek23
Pobieram kod html pewnej strony i chciałbym do zmiennej wrzucić jedynie tabelę, która wygląda mniej więcej tak:

...
<table class="messages largepadded">
<trd><td>...</td></tr>
....
</table>
...


Napisałem taką funkcję:

  1. function gettable($page)
  2. {
  3. preg_match("@<table class=\"messages largepadded\">(.*?)<\/table>@i", $page, $w);
  4. return $w[0];
  5. }



Ale przy wywołaniu tej funkcji:

  1. echo(gettable($s));


Otrzymuję błąd:
PHP Notice: Undefined offset: 0 in C:\inetpub\wwwroot\test.php on line 13


Pomoże ktoś?
wookieb
  1.  
  2. if(preg_match("@<table class=\"messages largepadded\">(.*?)<\/table>@i", $page, $w))
  3. {
  4. return $w[0];
  5.  
  6. }
  7. else return 'chyba nie ma takiej tabeli';
  8.  


I już znasz odpowiedź na dręczące pytania smile.gif
A żeby pewniej pobrać tabelę można użyć np phpquery.
Grzesiek23
Hmm nie wiem czemu, ale dopiero to zadziałało:

  1. function gettable($page)
  2. {
  3. preg_match("#<table ([^>]*)>(.*?)</table>#is", $page, $w);
  4. return $w[0];
  5. }



Mam jeszcze jedną sprawę - jak z tej tabeli, która wygląda tak:

  1. <table class="messages largepadded">
  2. <tr>
  3. <th width="35px">
  4. </th>
  5. <th width="40px">
  6. </th>
  7. <th width="505px">
  8. </th>
  9. <th width="110px">
  10. </th>
  11. </tr>
  12. <tr>
  13. <td>
  14. <input type="checkbox" name="delete_message[]" id="delete_message_88169456" value="88169456" />
  15. </td>
  16. <td>
  17. <img class="icon" src="/images/parts/icon-bell_notifications-empty.gif" alt="Icon-bell_notifications-empty" />
  18. </td>
  19. <td>
  20. <p class="smallpadded">
  21. <a href="/en/citizen/profile/606731">User</a> has transfered 1 PLN to your account.
  22. </p>
  23. </td>
  24. <td>
  25. <span class="fakeheight">one hour ago</span>
  26. </td>
  27. </tr>
  28. <tr>
  29. <td>
  30. <input type="checkbox" name="delete_message[]" id="delete_message_87473700" value="87473700" />
  31. </td>
  32. <td>
  33. <img class="icon" src="/images/parts/icon-bell_notifications-empty.gif" alt="Icon-bell_notifications-empty" />
  34. </td>
  35. <td>
  36. <p class="smallpadded">
  37. Some alert.
  38. </p>
  39. </td>
  40. <td>
  41. <span class="fakeheight">yesterday</span>
  42. </td>
  43. </tr>


Chciałbym, aby do tego pliku, do którego zapisuję tabele, zapisane zostały tylko wiersze, w których 3 komórka zawiera tekst:
has transfered (...) to your account

Pomoże mi ktoś z tym jeszcze?
Crozin
Cytat
Hmm nie wiem czemu, ale dopiero to zadziałało:
Ponieważ domyślnie wyrażenia regularne działają od pierwszego znaku do pierwszego wystąpienia znaku końca linii. Modyfikator "s" zmienia to zachowanie.

Co do drugiego pytania, to wyrażenie będzie miało mniej-więcej taką formę:
Kod
#<td>.*?has transfered .{,10} to your account.*?</td>#s
Ewentualnie, jeżeli zawsze jest zapis: LICZBA + PLN/EUR/USD to możesz dać:
Kod
\d+ (?:PLN|USD|EUR)
Zamiast tego
Kod
.{,10}
Grzesiek23
Próbuję tak:

  1. $filename="newfile.txt";
  2. $output="";
  3. $file = fopen($filename, "r");
  4. while(!feof($file)) {
  5.  
  6. //read file line by line into variable
  7. $output = $output . fgets($file, 4096);
  8.  
  9. }
  10. fclose ($file);
  11.  
  12. preg_match_all("#<td>.*?has transfered \d+ (?:PLN|GOLD) to your account.*?</td>#s", $output, $w);
  13. foreach ($w as $val) {
  14. echo($val[0]);
  15. }


Ale niestety nie działa to poprawnie - wybiera wszystkie wiersze.
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.