Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem nowicjusza z regexp
Forum PHP.pl > Forum > Przedszkole
nitro11
Witam,

Od niedawna bawię się z php.
Ostatnio bardzo zainteresował mnie cURL i próbuję się go nauczyć, ale mam pewne problemy.

Chciałem za pomocą cURL wyciągnąć sobie ze strony http://www.rmf.fm/au/?a=poplista
3 najpopularniejsze utwory, robię to tak:


  1. $url = 'http://www.rmf.fm/au/?a=poplista';
  2.  
  3.  
  4.  
  5. echo '<br/><br/>';
  6. $ch_e=curl_init($url);
  7. define('USER_AGENT', 'Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.3) Gecko/20060426 Firefox/1.0.6');
  8. curl_setopt($ch_e, CURLOPT_RETURNTRANSFER, 1);
  9. curl_setopt($ch_e, CURLOPT_FOLLOWLOCATION, 1);
  10. curl_setopt($ch_e, CURLOPT_USERAGENT, USER_AGENT);
  11. curl_setopt($ch_e, CURLOPT_SSL_VERIFYPEER, FALSE);
  12. curl_setopt($ch_e, CURLOPT_SSL_VERIFYHOST, 2);
  13. curl_setopt($ch_e, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt');
  14. curl_setopt($ch_e, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookie.txt');
  15. $nazwa=curl_exec($ch_e);
  16.  
  17.  
  18.  
  19. $wykonawca3 = '/<A HREF="\/muzyka(.+?)">(.+?)<\/A><br>(.+?) &nbsp/';
  20. preg_match_all($wykonawca3, $nazwa, $wyk3);
  21.  
  22.  
  23. for ($i=0; $i<3; $i++) {
  24.  
  25. $wyk3reg = '/<A HREF="(.+?)">(.+?)<\/A><br>(.+?) &nbsp/';
  26. preg_match_all($wyk3reg, $wyk3[0][$i], $wyk4);
  27.  
  28. //print_r($wyk4);
  29.  
  30. $wy=$wyk4[2][0];
  31. $ty=$wyk4[3][0];
  32.  
  33. echo $wy.' - '.$ty.'<br/>';
  34.  
  35.  
  36. }




W wyniku dostaję:

  1. <br/><br/>Travie McCoy feat. Bruno Mars - Billionaire<br/><IMG SRC="/au/poplista/img/teledysk.gif" BORDER=0></A> </TD><TD WIDTH=25></TD><TD WIDTH=60><A HREF="#" onClick="javascript -void window.open('/au/poplista/glosowanie.html?g=2&amp;idn=48101&amp;p=0','glospoplista','align=center,toolbar=no,status=no,location=no,directories=no,resizable=yes,scrol
    lbars=no,width=380,height=280,menubar=no');"
    ><IMG SRC="/au/poplista/img/up.gif" HSPACE=5 ALT=""></A><A HREF="#" onClick="javascript -void window.open('/au/poplista/glosowanie.html?g=1&amp;idn=48101&amp;p=0','glospoplista','align=center,toolbar=no,status=no,location=no,directories=no,resizable=yes,scrol
    lbars=no,width=380,height=280,menubar=no');"
    ><IMG SRC="/au/poplista/img/down.gif" ALT=""></A></TD></TR><TR CLASS="poplista-row poplista-row-back2"><TD WIDTH=45 align=center><IMG alt="6912" SRC="/main/img/popnum2.gif"></TD><TD WIDTH=85><img src="http -//doc.rmf.pl/media/img_muzyka/wykonawca/6/6912_x.jpg" width=70 height=70 alt=""></TD><TD WIDTH=475><A HREF="/muzyka/biografia,6912,Pectus.html">
    Pectus - Oceany<br/>OneRepublic - Marchin On<br/>



Ale nie pasuje mi ta część:

  1. <IMG SRC="/au/poplista/img/teledysk.gif" BORDER=0></A> </TD><TD WIDTH=25></TD><TD WIDTH=60><A HREF="#" onClick="javascript -void window.open('/au/poplista/glosowanie.html?g=2&amp;idn=48101&amp;p=0','glospoplista','align=center,toolbar=no,status=no,location=no,directories=no,resizable=yes,scrol
    lbars=no,width=380,height=280,menubar=no');"
    ><IMG SRC="/au/poplista/img/up.gif" HSPACE=5 ALT=""></A><A HREF="#" onClick="javascript -void window.open('/au/poplista/glosowanie.html?g=1&amp;idn=48101&amp;p=0','glospoplista','align=center,toolbar=no,status=no,location=no,directories=no,resizable=yes,scrol
    lbars=no,width=380,height=280,menubar=no');"
    ><IMG SRC="/au/poplista/img/down.gif" ALT=""></A></TD></TR><TR CLASS="poplista-row poplista-row-back2"><TD WIDTH=45 align=center><IMG alt="6912" SRC="/main/img/popnum2.gif"></TD><TD WIDTH=85><img src="http -//doc.rmf.pl/media/img_muzyka/wykonawca/6/6912_x.jpg" width=70 height=70 alt=""></TD><TD WIDTH=475><A HREF="/muzyka/biografia,6912,Pectus.html">



Jednak nie wiem jak się jej pozbyć.

W ogóle to jakaś dziwna sprawa bo wyrażenie regularne którego używam:
$wyk3reg = '/<A HREF="(.+?)">(.+?)<\/A><br>(.+?) &nbsp/';

Powinno działać po dodaniu na końcu
$wyk3reg = '/<A HREF="(.+?)">(.+?)<\/A><br>(.+?) &nbsp <SPAN ID/';

bo tak jest na stronie, jednak to wyrażenie nie działa.

Proszę o pomoc.
athei
Zły tytuł dałeś, bo problem nie z curlem a z regexp masz.
Kod
$wykonawca3 = '#<table class="poplista-toptable" .*>(.*)</table>#iU';
preg_match($wykonawca3, $nazwa, $wyk3);
var_dump($wyk3);
wyciąga tabele

albo

Kod
$wykonawca3 = '#<tr class="poplista-row poplista-row-back\d".*>(.*)</tr>#iU';
preg_match_all($wykonawca3, $nazwa, $wyk3);
var_dump($wyk3);
wyciąga wiersze
Póżniej sobie przejedź po tablicy( np foreach) i powyciągaj to co chcesz.
nitro11
Rzeczywiście pomyliłem nazwę tytułu ale już poprawiłem smile.gif

Co do tego co napisałeś to rozumiem, ale czy nie można jakoś zmodyfikować mojego wyrażenia,
żeby po prostu od razu wyciągało to co trzeba i żeby się już nie bawić potem w dodatkowe wyciąganie tabel itp ?
athei
rozumiem ze z tych 3 chcesz link, tyt i aut to
Kod
$wykonawca3 = '#<table class="poplista-toptable" .*>(.*)</table>#iU';
preg_match($wykonawca3, $nazwa, $wyk3);

$wyk3reg = '#<a href="(/muzyka/biografia.*)">(.*)</a><br>(.*) &nbsp#iU';
preg_match_all($wyk3reg, $wyk3[0], $wyk4);

for($i=0;$i<3;$i++)
{
    echo $wyk4[1][$i] . ' ' .$wyk4[2][$i] . ' ' . $wyk4[3][$i];
    echo '<br />';
}

Na przyszłość rób bardziej szczegółowe wyr.reg. to będzie dobrze wyciągać.
nitro11
Niestety nie działa.

Okazało się, że w międzyczasie stronka się zmieniła.
Zmieniłem kod na taki:


  1. $wykonawca3 = '/<div class="song-artist"><A HREF="(.+?)">(.+?)<\/A><\/div><div class="song-title">(.+?)<\/div><\/DIV><DIV/';
  2. preg_match_all($wykonawca3, $nazwa, $wyk3);
  3. //print_r($wyk3);
  4.  
  5. for ($i=0; $i<20; $i++) {
  6.  
  7. $wy2=$wyk3[2][$i];
  8. $ty2=$wyk3[3][$i];
  9.  
  10.  
  11. echo $wy2.'-'.$ty2.'<br/>';


$wy2 jest ok, ale $ty2 nie wiem dlaczego do tytułu dokleja taki ciąg:

  1. <DIV CLASS="poplistanew-play"><SPAN ID="pid309287b4842baf8b24f5ba373acd5bf5"><A HREF="#" onClick="mp3Load('popplay','pid309287b4842baf8b24f5ba373acd5bf5','http -//doc.rmf.pl/media/hooki/de_mono_-_poki_na_to_czas.mp3'); return false;" TITLE="Posłuchaj"><IMG CLASS="dynaplayer" SRC="/inc/img/picoplayer-play.gif" WIDTH=17 HEIGHT=13></A></SPAN></DIV>


W sumie można to już usunąć za pomocą preg_replace, ale dlaczego to w ogóle się dokleja i czy w ogóle się da to wyciągnąć od razu (bez doklejenia tych śmieci, innym wyrażeniem), czy jednak trzeba to jeszcze przeleciec preg_replace ?

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.