PHP: Parsa HTML med preg_match_all?

Permalänk
Medlem

PHP: Parsa HTML med preg_match_all?

Jo, nu är det så här att jag behöver hämta ut lite info från Filmtipset.se, men som alltid är jag helt lost vad gäller reguljära uttryck. Istället för att köra trial and error ber jag om en hjälpande hand.

<div class="outer_row" style="width:496px;"><div class="row" style="height: 18px; width:466px; background-image: url(http://images.filmtipset.se/grade_images/grade_14_bg_middle.g...);"><div class="title title_14" style="border-style:none;margin-left: 20px;max-width:336px"><a href="film/mystery-train.html" onmouseover="wait_for_info('info_5300', '5300' ,'http://images.filmtipset.se/posters/5300.gif', event);" onmouseout="hide_info('info_5300','5300');" rel="nofollow">Mystery Train</a></div></div><div class="back_row" style="margin-left:466px;background-image: url(http://images.filmtipset.se/grade_images/grade_14_bg_back.gif);"></div><div class="front_row" style="background-image: url(http://images.filmtipset.se/grade_images/grade_14_bg_front.gi...);"></div><div class="price" title="Köp den på discshop" style="color:black;margin-left:406px;"><a href="pris/mystery-train.html" rel="nofollow">229:-</a></div><div class="review" style="margin-left:396px;"title="Recension"></div><div class="mygrade" style="margin-left:7px;"><img src="http://images.filmtipset.se/grade_images/grade_14.gif" border="0" align="top" vspace="1" height="17" alt="" /></div><div class="other_grade" style="cellspacing:0px;margin-left: 476px;"><div class="other_grade_1" style="cellspacing:0px;left:-476px"><img class="SetGradeImg" src="http://images.filmtipset.se/Images/grade_4_seen_member.gif" border="0" align="top" vspace="1" alt=""/></div></div><div class="grade" style="margin-left:471px;"></div><div class="movie_pop" id="info_5300" onmouseover="hide_info('info_5300', '5300');" onmouseout="hide_info('info_5300', '5300');"><div class="movie_pop_img"><img src="http://images.filmtipset.se/Images/1x1.gif" id="image_info_5300" alt=""/></div><div class="movie_pop_text"><div class="movie_pop_info"><b><i>Titel:</i></b> Mystery Train</div><div class="movie_pop_info"><b><i>Originaltitel:</i></b> Mystery Train</div><div class="movie_pop_info"><b><i>Regissör:</i></b> Jim Jarmusch</div><div class="movie_pop_info"><b><i>År:</i></b> 1989</div><div class="movie_pop_info"><b><i>Längd:</i></b> 113 min</div><div class="movie_pop_info"><b><i>Film nr.:</i></b> 5300</div></div></div></div> <div style="" class=favoritetext>Tre berättelser med en gemensam tidsaxel och nämnare. Kanske lite trött och gjord idag, men med intressanta karaktärer, konversationer och en självförvållad och envis nyfikenhet för vad som komma skall hålls intresset uppe och nog gör filmen skäl för sitt betyg. 4-/5</div>

Det är alltså det i fetstil jag vill få ut - filminfon, det satta betyget och kommentaren. Kan ni hjälpa mig eller ge mig någon fingervisning om hur jag ska gå till väga?

Permalänk
Medlem
Skrivet av viek:

Jo, nu är det så här att jag behöver hämta ut lite info från Filmtipset.se, men som alltid är jag helt lost vad gäller reguljära uttryck. Istället för att köra trial and error ber jag om en hjälpande hand.

<div class="outer_row" style="width:496px;"><div class="row" style="height: 18px; width:466px; background-image: url(http://images.filmtipset.se/grade_images/grade_14_bg_middle.g...);"><div class="title title_14" style="border-style:none;margin-left: 20px;max-width:336px"><a href="film/mystery-train.html" onmouseover="wait_for_info('info_5300', '5300' ,'http://images.filmtipset.se/posters/5300.gif', event);" onmouseout="hide_info('info_5300','5300');" rel="nofollow">Mystery Train</a></div></div><div class="back_row" style="margin-left:466px;background-image: url(http://images.filmtipset.se/grade_images/grade_14_bg_back.gif);"></div><div class="front_row" style="background-image: url(http://images.filmtipset.se/grade_images/grade_14_bg_front.gi...);"></div><div class="price" title="Köp den på discshop" style="color:black;margin-left:406px;"><a href="pris/mystery-train.html" rel="nofollow">229:-</a></div><div class="review" style="margin-left:396px;"title="Recension"></div><div class="mygrade" style="margin-left:7px;"><img src="http://images.filmtipset.se/grade_images/grade_14.gif" border="0" align="top" vspace="1" height="17" alt="" /></div><div class="other_grade" style="cellspacing:0px;margin-left: 476px;"><div class="other_grade_1" style="cellspacing:0px;left:-476px"><img class="SetGradeImg" src="http://images.filmtipset.se/Images/grade_4_seen_member.gif" border="0" align="top" vspace="1" alt=""/></div></div><div class="grade" style="margin-left:471px;"></div><div class="movie_pop" id="info_5300" onmouseover="hide_info('info_5300', '5300');" onmouseout="hide_info('info_5300', '5300');"><div class="movie_pop_img"><img src="http://images.filmtipset.se/Images/1x1.gif" id="image_info_5300" alt=""/></div><div class="movie_pop_text"><div class="movie_pop_info"><b><i>Titel:</i></b> Mystery Train</div><div class="movie_pop_info"><b><i>Originaltitel:</i></b> Mystery Train</div><div class="movie_pop_info"><b><i>Regissör:</i></b> Jim Jarmusch</div><div class="movie_pop_info"><b><i>År:</i></b> 1989</div><div class="movie_pop_info"><b><i>Längd:</i></b> 113 min</div><div class="movie_pop_info"><b><i>Film nr.:</i></b> 5300</div></div></div></div> <div style="" class=favoritetext>Tre berättelser med en gemensam tidsaxel och nämnare. Kanske lite trött och gjord idag, men med intressanta karaktärer, konversationer och en självförvållad och envis nyfikenhet för vad som komma skall hålls intresset uppe och nog gör filmen skäl för sitt betyg. 4-/5</div>

Det är alltså det i fetstil jag vill få ut - filminfon, det satta betyget och kommentaren. Kan ni hjälpa mig eller ge mig någon fingervisning om hur jag ska gå till väga?

Snygga upp koden och gör den mer semantisk, skriv inte

<b>

och

<i>

utan använd css-mallen till det och sen kan du enkelt skriva regexp som plockar fram det relevanta från div-en/span-et med rätt namn. Så skulle jag ha gjort.

Permalänk

$regex = '/class=favoritetext>(.*)<\/div>/';

Edit: Jag kanske ska läsa klart först, detta ger bara kommentaren. Fixar resten strax

Permalänk
Medlem
Skrivet av Meat:

Snygga upp koden och gör den mer semantisk, skriv inte

<b>

och

<i>

utan använd css-mallen till det och sen kan du enkelt skriva regexp som plockar fram det relevanta från div-en/span-et med rätt namn. Så skulle jag ha gjort.

Behöver jag verkligen snygga upp koden jag ska hämta data ifrån? Jag har här kommit en liten bit på väg i alla fall, men jag får inte riktigt ut kommentaren. Alltså:

Titel:<.+>\s(.+)<\/div>.+Originaltitel:<.+>\s(.+)<\/div>.+Regissör:<.+>\s(.+)<\/div>.+År:<.+>\s(.+)<\/div>.+Längd:<.+>\s(.+)\smin<\/div>.+Film nr.:<.+>\s(.+)<\/div>.+favoritetext>(.+)<\/div>

Permalänk
Medlem
Skrivet av Meat:

sen kan du enkelt skriva regexp som plockar fram det relevanta från div-en/span-et med rätt namn.

Du kan inte filtrera (X)HTML med reguljära uttryck, åtminstone inte tillförlitligt. Använd rätt verktyg, dvs. en XML/HTML-parser. Det finns sådana till i princip alla språk.

Permalänk
Medlem

Lite mer hjälp?

Permalänk
Medlem
Skrivet av viek:

Lite mer hjälp?

Du borde lyssna på You, :).

HTML är ett för komplicerat språk för att beskriva med reg.exp. (då det inte finns någon gräns på hur djupt det går att nästa element). Det må finnas fall där du kan klara dig med bara reg.exp., men om det är mycket text som ska hämtas ut eller att den är formaterad på något jobbigt sätt är det troligen enklare att använda något verktyg som kan tolka HTML-koden och ge dig ett DOM-träd istället. En ev. lösning i reg.exp. skulle troligen vara jobbigare att skriva (som nuvarande motgångar tyder på?) och vara mer känslig för ändringar i HTML-koden.

Testa t.ex. DOMDocument::loadHTML eller liknande istället, där du kan använda det vanliga (dock hemska) DOM API:et.