Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Pobieranie danych z tabeli ze strony+zapis do bazy danych, Pobieranie danych z tabeli ze strony+zapis do bazy danych
-richard_rahl-
post
Post #1





Goście







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! : )
Go to the top of the page
+Quote Post
abort
post
Post #2





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


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.

Ten post edytował abort 10.11.2011, 08:26:17
Go to the top of the page
+Quote Post
-richard_rahl-
post
Post #3





Goście







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. }
Go to the top of the page
+Quote Post
gorden
post
Post #4





Grupa: Zarejestrowani
Postów: 486
Pomógł: 101
Dołączył: 27.06.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
-richard_rahl-
post
Post #5





Goście







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. ?>
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 04:15