Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] preg match all - maly problem.
Forum PHP.pl > Forum > Przedszkole
garfieldmaxx
Od razu uprzedzam, ze problem moze byc dla was trywialny. Na swoje usprawiedliwienie mam to ze nigdy nie uczylem sie zadnego jezyka programowania, a ten skrypt PHP probuje pisac uczac sie tylko tego co mi potrzebne zeby dzialal. biggrin.gif

Otoz chce zczytac pewne dane ze strony www. Z pomoca osob z IRCa doszedlem do momemtu w ktorym sukcesywnie udalo mi sie dobrac to wspomnianej juz strony za pomoca CURL. Wiem tez ze musze uzyc preg match all, aby przechwycic interesujace mnie dane.

Problem w tym, ze pomimo moich wysilkow strona jest zawsze pusta. Podejrzewam, ze moje zapytanie jest bledne, i dlatego skrypt niczego nie zwraca.. ocencie sami. Wyrazenie regularne sa dla mnie trudnym orzechem do rozgryzienia, wiec jesli ktos poswieci troche czasu na wytlumaczenie mi tego zagadnienia, bede bardzo wdzieczny smile.gif



Strona jest bardzo dluga, a mnie interesuja tylko te dane:

  1. <td class="jm_salary">
  2. <strong>7</strong><sup>.48 <strong>CAD</strong></sup>
  3. </td>

Z powyzszego kawalka kodu chcialbym wydostac 7.48 CAD.



Z gory dziekuje za wszelka udzielona mi pomoc smile.gif



  1.  
  2. <?php
  3. curl_login('http://www.erepublik.com/en/login','_token=-------------------------------------------------','','off');
  4.  
  5. $linkrt = curl_grab_page('http://economy.erepublik.com/en/market/job/23/all/1/0/desc','','off');
  6.  
  7. preg_match_all('#<td class="jm_salary">
  8. <strong>.</strong><sup>.* <strong>CAD</strong></sup>
  9. </td>#',
  10. $linkrt,
  11. $out, PREG_PATTERN_ORDER);
  12.  
  13. echo $out[0][0];
  14. echo $out[1][0];
  15. echo $out[2][0];
  16. echo $out[3][0];
  17. echo $out[4][0];
  18. echo $out[4][0];
  19. echo $out[5][0];
  20. echo $out[6][0];
  21. echo $out[7][0];
  22.  
  23.  
  24.  
  25.  
  26. //to jest ta nieistotna, dzialajaca czesc skryptu CURL
  27.  
  28. function curl_login($url,$data,$proxy,$proxystatus){
  29. $fp = fopen("cookie.txt", "w");
  30. fclose($fp);
  31. $login = curl_init();
  32. curl_setopt($login, CURLOPT_COOKIEJAR, "cookie.txt");
  33. curl_setopt($login, CURLOPT_COOKIEFILE, "cookie.txt");
  34. curl_setopt($login, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
  35. curl_setopt($login, CURLOPT_TIMEOUT, 40);
  36. curl_setopt($login, CURLOPT_RETURNTRANSFER, TRUE);
  37. if ($proxystatus == 'on') {
  38. curl_setopt($login, CURLOPT_SSL_VERIFYHOST, FALSE);
  39. curl_setopt($login, CURLOPT_HTTPPROXYTUNNEL, TRUE);
  40. curl_setopt($login, CURLOPT_PROXY, $proxy);
  41. }
  42. curl_setopt($login, CURLOPT_URL, $url);
  43. curl_setopt($login, CURLOPT_HEADER, TRUE);
  44. curl_setopt($login, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  45. curl_setopt($login, CURLOPT_FOLLOWLOCATION, TRUE);
  46. curl_setopt($login, CURLOPT_POST, TRUE);
  47. curl_setopt($login, CURLOPT_POSTFIELDS, $data);
  48. ob_start(); // prevent any output
  49. return curl_exec ($login); // execute the curl command
  50. ob_end_clean(); // stop preventing output
  51. curl_close ($login);
  52. unset($login);
  53. }
  54.  
  55. function curl_grab_page($site,$proxy,$proxystatus){
  56. $ch = curl_init();
  57. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  58. if ($proxystatus == 'on') {
  59. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  60. curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
  61. curl_setopt($ch, CURLOPT_PROXY, $proxy);
  62. }
  63. curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
  64. curl_setopt($ch, CURLOPT_URL, $site);
  65. ob_start(); // prevent any output
  66. return curl_exec ($ch); // execute the curl command
  67. ob_end_clean(); // stop preventing output
  68. curl_close ($ch);
  69. }
  70.  
  71. ?>

Neo
  1. #<td class="jm_salary">
  2. <strong>(\d+)</strong><sup>\.(\d+)<strong>CAD</strong></sup>
  3. </td>#s
garfieldmaxx
Cytat(Neo @ 18.07.2010, 19:48:04 ) *
  1. #<td class="jm_salary">
  2. <strong>(\d+)</strong><sup>\.(\d+)<strong>CAD</strong></sup>
  3. </td>#s



Niestety bez skutku, nadal nie dziala.
kipero
A jaka jest zawartość zmiennej $linkrt?
garfieldmaxx
Cytat(kipero @ 18.07.2010, 20:24:26 ) *
A jaka jest zawartość zmiennej $linkrt?


Kod byl zbyt wielki zeby umiescic go tutaj, umiescilem go na zewnetrznej stronie, wiec jesli ktos ma chwilke zajrzec to bede wdzieczny.

Zawartosc zmiennej $linkrt
kapuch
Kod
#<strong>(.+?)<\/strong><sup>(.+?)<strong>(.+?)<\/strong><\/sup>#is

Sproboj to, wlasciwie jest to troche zmodyfikowany przyklad kolegi Neo
Ale musi dzialac.
garfieldmaxx
Dzieki za wasze zaangazowanie smile.gif

Niestety zaden z podanych przez was kodow nie zadzialal.
Postanowilem jednak przeprowadzic maly test, utworzylem drugi plik z takim oto kodem (zawarlem w nim tylko ta czesc z ktorej wyciagam dane) i wszystkie wasze propozycje zadzialaly!

  1. <?php
  2.  
  3. $linkrt='
  4.  
  5. <td class="jm_salary">
  6. <strong>0</strong><sup>.48 <strong>CAD</strong></sup>
  7. </td>
  8. <td class="jm_salary">
  9. <strong>2</strong><sup>.48 <strong>CAD</strong></sup>
  10. </td>
  11. <td class="jm_salary">
  12. <strong>1</strong><sup>.48 <strong>CAD</strong></sup>
  13. </td><strong>
  14. <td class="jm_salary">
  15. <strong>4</strong><sup>.48 <strong>CAD</strong></sup>
  16. </td>
  17. <td class="jm_salary">
  18. <strong>7</strong><sup>.48 <strong>CAD</strong></sup>
  19. </td>
  20. ';
  21.  
  22.  
  23. echo $linkrt;
  24.  
  25.  
  26. #<strong>(.+?)<\/strong><sup>(.+?)<strong>(.+?)<\/strong><\/sup>#is
  27. ',
  28.  
  29.  
  30.  
  31. $linkrt,
  32. $out, PREG_PATTERN_ORDER);
  33.  
  34. echo $out[0][0]. "<br>";
  35. echo $out[0][1]. "<br>";
  36. echo $out[0][2]. "<br>";
  37. echo $out[0][3]. "<br>";
  38. echo $out[0][4]. "<br>";
  39.  
  40. ?>


Cos mi tutaj nie gralo, bo jednak gdy laduje cala strone zaden kod nie dziala. Postanowilem metoda prob i bledow znalezc ten fragment kodu, ktory powoduje ze wszystko sie sypie. Ponizszy kod, w ktorym dodalem czesc skryptow osadzonych na stronie z ktorej pobieram te dane, powoduje, ze nawet funkcja echo umieszczona zaraz pod juz sie nie uruchamia. Nie mam zielonego pojecia co o tym myslec :/

  1. <?php
  2.  
  3. $linkrt='
  4. <script type="text/javascript" charset="utf-8">
  5. var hostname = 'www.erepublik.com';
  6. var domainname = 'erepublik.com';
  7. var economyhostname = 'economy.erepublik.com';
  8. </script>
  9.  
  10. <script type="text/javascript" src="http://www.erepublik.com/js/global.js"></script>
  11. <script type="text/javascript" src="http://www.erepublik.com/js/sifr.enable.js"></script>
  12. <script type="text/javascript" charset="utf-8">
  13. window.confirmation = {
  14. ok: 'ok',
  15. yes: 'yes',
  16. no: 'no'
  17. };
  18. </script>
  19. <script type="text/javascript" charset="utf-8">
  20. if (top.location != location) {
  21. top.location.href = document.location.href ;
  22. }
  23. </script>
  24.  
  25. <td class="jm_salary">
  26. <strong>0</strong><sup>.48 <strong>CAD</strong></sup>
  27. </td>
  28. <td class="jm_salary">
  29. <strong>2</strong><sup>.48 <strong>CAD</strong></sup>
  30. </td>
  31. <td class="jm_salary">
  32. <strong>1</strong><sup>.48 <strong>CAD</strong></sup>
  33. </td><strong>
  34. <td class="jm_salary">
  35. <strong>4</strong><sup>.48 <strong>CAD</strong></sup>
  36. </td>
  37. <td class="jm_salary">
  38. <strong>7</strong><sup>.48 <strong>CAD</strong></sup>
  39. </td>
  40. ';
  41.  
  42.  
  43. echo $linkrt;
  44.  
  45.  
  46. #<strong>(.+?)<\/strong><sup>(.+?)<strong>(.+?)<\/strong><\/sup>#is
  47. ',
  48.  
  49.  
  50.  
  51. $linkrt,
  52. $out, PREG_PATTERN_ORDER);
  53.  
  54. echo $out[0][0]. "<br>";
  55. echo $out[0][1]. "<br>";
  56. echo $out[0][2]. "<br>";
  57. echo $out[0][3]. "<br>";
  58. echo $out[0][4]. "<br>";
  59.  
  60. ?>
kapuch
dlatego ze Twoja zmienna $link wyglada tak:
  1. $linkrt='
  2. <script type="text/javascript" charset="utf-8">
  3. var hostname = '// tu juz zmienna sie konczy, az dziwne, ze nie sypnelo ci bledami.

Wiesz o co mi chodzi?
Tresc zmiennej chciales umiescic pomiedzy apostrofami, ale nie zauwazyles ze w tresci tez sa apostrofy winksmiley.jpg
Zastap w tresci wszystkie ( ' ) na ( \' ).
garfieldmaxx
Cytat(kapuch @ 18.07.2010, 22:44:09 ) *
dlatego ze Twoja zmienna $link wyglada tak:
  1. $linkrt='
  2. <script type="text/javascript" charset="utf-8">
  3. var hostname = '// tu juz zmienna sie konczy, az dziwne, ze nie sypnelo ci bledami.

Wiesz o co mi chodzi?
Tresc zmiennej chciales umiescic pomiedzy apostrofami, ale nie zauwazyles ze w tresci tez sa apostrofy winksmiley.jpg
Zastap w tresci wszystkie ( ' ) na ( \' ).



Nie zauwazylem, a co tu duzo mowic - uznalem, ze tak moze byc sad.gif

Poszukalem w Google i znalazlem polecenie addslashes().
Problem w tym, ze addslashes() nie dziala bo skrypt sypie sie juz przy zmiennej. Czy jest jakis sposob, zeby zapisac ta zmienna ze strona tak aby skrypt PHP wykonywal sie dalej, zebym mogl automatycznie dodac '\' ?
kapuch
Ale ze strony to pobierzesz bez problemu, mi chodzilo o reczne przypisywanie tresci do zmiennej.
garfieldmaxx
Dziekuje wszystkim za pomoc, problem zostal rozwiazany i wszystko pieknie dziala smile.gif
chemikdeb
napisz jak rozwiazles problem a nie tylko szukasz
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.