Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Problem nowicjusza z regexp
nitro11
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 30.08.2010

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


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.

Ten post edytował nitro11 30.08.2010, 13:28:39
Go to the top of the page
+Quote Post
athei
post
Post #2





Grupa: Zarejestrowani
Postów: 389
Pomógł: 141
Dołączył: 11.04.2009

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


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





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 30.08.2010

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


Rzeczywiście pomyliłem nazwę tytułu ale już poprawiłem (IMG:style_emoticons/default/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 ?
Go to the top of the page
+Quote Post
athei
post
Post #4





Grupa: Zarejestrowani
Postów: 389
Pomógł: 141
Dołączył: 11.04.2009

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


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





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 30.08.2010

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


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 ?



Ten post edytował nitro11 2.09.2010, 12:46:18
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 5.10.2025 - 10:35