Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Pobieranie danych z tabeli ze strony+zapis do bazy danych
Forum PHP.pl > Forum > Przedszkole
richard_rahl
Witajcie! Uczę się dopiero wyrazen regularnych i ogolnie php, calej reszty. Jedna rzecz mi spedza sen z powiek.. Chce pobrac dane z tabelki na zewnetrznej stronie internetowej, a nastepnie zapisac do bazy danych, niestety nie wychodzi. Zalezy mi jedynie na skrocie nazwy indeksu i jego cenie na gieldzie. Pokazuje blad:

Warning: preg_match() [function.preg-match]: Unknown modifier 'a' in /home/amplaman/public_html/PHPPage4.php on line 1162

Podaje kod:

  1. <?php
  2. //pobierasz kod strony
  3. $page = file_get_contents('http://rzeczpospolita.pl/ekonomia/gielda.html');
  4.  
  5. //wyrażenie regularne
  6. $pattern = '/<tr onMouseOver="this.style.backgroundColor=^.+$" onMouseOut="this.style.backgroundColor=^.+$" test id=^.[a-z]+.+$>
  7. <td align=left><a href="spolka.html?t=^...$">^.+$</a></td>
  8. <td align=center><a href=^.+$>^...$ </a></td>
  9. <td align=center>^C$</td>
  10. <td align=center nowrap>^\d+.d+.d+$</td>
  11. <td align=right>^\d.d+$</td>
  12. <td align=right>^\d.d+$</td>
  13. <td align=right>^\d.d+$</td>
  14. <td align=right>^\d.d+$</td>
  15. <td align=right class=^.\D+.$>^\d.d+$</td>
  16. <td align=right class=^.\D+.$><nobr>^.\d+.\d+$</nobr></td>
  17. <td align=right>^.+$</td>
  18. <td align=right>^.+$</td>
  19. <td align=right>^.+$</td>/';
  20.  
  21. //jeżeli jest/są dopasowania...
  22. if(preg_match($pattern, $page, $matches, PREG_SET_ORDER)){
  23. //...dla każdego wyniku (w pętli)...
  24. foreach($matches as $match){
  25. //...wyescapowane wartości umieszczasz w bazie
  26. $walor = $match[?];
  27. $cena = $match[?];
  28.  
  29. mysql_query("INSERT INTO elgg_walory (walor,cena) VALUES ('$walor', '$cena)", $sql);
  30. //(warto jeszcze zadbać o to, żeby się nie powtarzały albo najpierw wyczyścić tabelę)
  31. }
  32. mysql_close($sql);
  33. }
  34.  
  35.  
  36.  
  37. ?>
  38. </body>
  39. </html>



Dzieki z gory za pomoc! : )
abort
W skrócie i uproszczeniu: preg_match szuka ciągu znaków otoczonego z lewej strony przez '/ - a z prawej strony przez /'.
Oznacza to, że:
1. Do funkcji przekazujesz ciąg znaków otoczony w ''
2. preg_match (zresztą, wszystkie preg_*) bada pierwszy znak jako "delimiter wyrażenia regularnego".

A Ty w środku tego wyrażenia dajesz mnóstwo zamykających tagów HTML, które zawierają "/" - preg_match uznaje to za koniec wyrażenia, i wszystko co następne uznaje za "modifier". Tu konkretnie bruździ linia kodu nr 7, i tag "</a>", o czym php nie omieszkało poinformować jakże czytelnym komunikatem.

Rozwiązania są dwa:
1. wyescape'ować wszystkie "/" na "\/" - co zapewni to co chcesz
2. użyć zamiast '/wyrażenie regularne/' czegoś innego, np '@wyrażenie regularne@' - krótko pisząc, delimiterem dla całego wyrażenia regularnego ustaw sobie inny znak niż "/". Może to być dowolny znak z wyjątkiem: backslasha (\), whitespace, litery lub cyfry. Najczęściej spotkałem się z '+', "@" i "~". Choć "+" akurat nie jest najszczęśliwszy - bo dość często występuje w samych wyrażeniach regularnych. Oczywiście, jeśli jako delimiter dasz "@", to przy dopasowywaniu np. adresu mailowego musisz w patternie dla preg_* wpisywać "\@", np: '@user\@host'. Dlatego najlepiej wybrać coś, co relatywnie rzadko występuje w badanych ciągach - poczytaj http://pl2.php.net/manual/en/regexp.reference.delimiters.php

Który sposób będzie dla Ciebie lepszy? Popróbuj.
richard_rahl
Witam! Dziękuję za pomoc, teraz wszystko gra, użyłem "#". Teraz nieco inny problem pozostaje - nie wyskakuje już żaden błąd, ale dane nie zapisują się w bazie danych. Co może być zrypane?

  1. <?php
  2. //pobierasz kod strony
  3. $page = file_get_contents('http://rzeczpospolita.pl/ekonomia/gielda.html');
  4.  
  5. //wyrażenie regularne
  6. $pattern = '#<tr onMouseOver="this.style.backgroundColor=^.+$" onMouseOut="this.style.backgroundColor=^.+$" test id=^.[a-z]+.+$>
  7. <td align=left><a href="spolka.html?t=^...$">^.+$</a></td>
  8. <td align=center><a href=^.+$>^...$ </a></td>
  9. <td align=center>^C$</td>
  10. <td align=center nowrap>^\d+.d+.d+$</td>
  11. <td align=right>^\d.d+$</td>
  12. <td align=right>^\d.d+$</td>
  13. <td align=right>^\d.d+$</td>
  14. <td align=right>^\d.d+$</td>
  15. <td align=right class=^.\D+.$>^\d.d+$</td>
  16. <td align=right class=^.\D+.$><nobr>^.\d+.\d+$</nobr></td>
  17. <td align=right>^.+$</td>
  18. <td align=right>^.+$</td>
  19. <td align=right>^.+$</td>#';
  20.  
  21. //jeżeli jest/są dopasowania...
  22. if(preg_match_all($pattern, $page, $matches, PREG_SET_ORDER)){
  23. //...dla każdego wyniku (w pętli)...
  24. foreach($matches as $match){
  25. //...wyescapowane wartości umieszczasz w bazie
  26. $walor = $match[2];
  27. $cena = $match[9];
  28.  
  29. mysql_query("INSERT INTO elgg_walory (walor,cena) VALUES ('$walor', '$cena)", $sql);
  30. //(warto jeszcze zadbać o to, żeby się nie powtarzały albo najpierw wyczyścić tabelę)
  31. }
  32. mysql_close($sql);
  33. }
gorden
linia 29, nie zamykasz apostrofu. ogólnie gdybyś użył die to od razu zlokalizowałbyś problem. a tak na marginesie, dobrym rozwiązaniem w Twoim foreach będzie list
richard_rahl
Poprawiłem apostrof i dodałem die, ale baza danych nadal pusta ; o

  1. <?php
  2. //pobierasz kod strony
  3. $page = file_get_contents('http://rzeczpospolita.pl/ekonomia/gielda.html');
  4.  
  5. //wyrażenie regularne
  6. $pattern = '#<tr onMouseOver="this.style.backgroundColor=^.+$" onMouseOut="this.style.backgroundColor=^.+$" test id=^.[a-z]+.+$>
  7. <td align=left><a href="spolka.html?t=^...$">^.+$</a></td>
  8. <td align=center><a href=^.+$>^...$ </a></td>
  9. <td align=center>^C$</td>
  10. <td align=center nowrap>^\d+.d+.d+$</td>
  11. <td align=right>^\d.d+$</td>
  12. <td align=right>^\d.d+$</td>
  13. <td align=right>^\d.d+$</td>
  14. <td align=right>^\d.d+$</td>
  15. <td align=right class=^.\D+.$>^\d.d+$</td>
  16. <td align=right class=^.\D+.$><nobr>^.\d+.\d+$</nobr></td>
  17. <td align=right>^.+$</td>
  18. <td align=right>^.+$</td>
  19. <td align=right>^.+$</td>#';
  20.  
  21. //jeżeli jest/są dopasowania...
  22. if(preg_match_all($pattern, $page, $matches, PREG_SET_ORDER)){
  23. //...dla każdego wyniku (w pętli)...
  24. foreach($matches as $match){
  25. //...wyescapowane wartości umieszczasz w bazie
  26. $walor = $match[2];
  27. $cena = $match[9];
  28.  
  29. $sql3 ="INSERT INTO elgg_walory (walor,cena) VALUES ('$walor', '$cena')";
  30. $rezultat3 = mysql_query($sql3, $polacz) or die(mysql_error());
  31. //(warto jeszcze zadbać o to, żeby się nie powtarzały albo najpierw wyczyścić tabelę)
  32. }
  33.  
  34. }
  35.  
  36.  
  37. ?>
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-2024 Invision Power Services, Inc.