Kan du garantera att:
- det är lika många värden i båda arrayer?
- pris[x] hör i hop med namn[x]?
varför inte göra en preg_match_all som matchar både namn och pris?
19 svar · 1 176 visningar · startad av Guldstrand
Hur löser jag det bäst om jag vill visa resultat från 2 arrays i en loop?
preg_match_all('/<b><span class="price_normal">(.*?):-<\/span><\/b>/i', $html, $pris, PREG_SET_ORDER);
preg_match_all('/"><b>(.*?)<\/b>/i', $html, $namn, PREG_SET_ORDER);
Jag vill alltså kunna visa Pris (array 1) och Namn (array 2) i samma loop.
Kan du garantera att:
- det är lika många värden i båda arrayer?
- pris[x] hör i hop med namn[x]?
varför inte göra en preg_match_all som matchar både namn och pris?
Kan du garantera att:
- det är lika många värden i båda arrayer?
- pris[x] hör i hop med namn[x]?varför inte göra en preg_match_all som matchar både namn och pris?
Ja, både namn och pris ska finnas i alla resultat.
Orsaken till att jag inte bara har EN "preg_match_all", är p.g.a. bristande kunskap.
Det här ska nog fungera:
foreach($pris as $key => $val)
{
echo "namn: " . $namn[$key][1] . ", pris: " . $val[1] . "\n";
}
Om du bifogar ett exempel på html-koden så kan vi hjälpa dig med att göra det till en preg_match_all.
Det här ska nog fungera:
foreach($pris as $key => $val) { echo "namn: " . $namn[$key][1] . ", pris: " . $val[1] . "\n"; }Om du bifogar ett exempel på html-koden så kan vi hjälpa dig med att göra det till en preg_match_all.
Att inte jag tänkte på det. :r
Nu fungerar det precis som det ska. Tusen tack!
Skulle även behöva veta hur jag löser det med flera arrays, (från flera olika sidor).
EDIT: Kom precis på att jag behöver ytterligare ett pattern, hur gör jag då.
preg_match_all('/<b><span class="price_normal">(.*?):-<\/span><\/b>/i', $html, $pris, PREG_SET_ORDER);
preg_match_all('/"><b>(.*?)<\/b>/i', $html, $namn, PREG_SET_ORDER);
preg_match_all('/<\/a><br>(.*?)<\/div>/ix', $html, $besk, PREG_SET_ORDER);
*bumpellibump*
:r
foreach($pris as $key => $val)
{
echo "namn: " . $namn[$key][1] . ", pris: " . $val[1] . ", besk: " . $besk[$key][1] . "\n";
}
Skulle behöva ha ett pattern för "21 träffar", "Poster: Friends" och "129".
I denna utskrift:
<div class="ds_list_header">
<div style="margin: 8px; float: left;"><b><a href="">Posters & prylar</a></b></div>
<div style="margin: 8px; float: right; color: rgb(102, 102, 102);"><b>21 träffar</b></div>
</div>
<p>
</p>
<form action="search_solr.php?ref=&lang=se&subsite=posters&cont=" method="post">
<div class="ds_l" style="height: 75px;">
<div class="ds_l_img" style="height: 65px;">
<a href="http://www.discshop.se/shop/ds.php?red=ds_produkt.php&&arg=id@@@80517,,,lang@@@se,,,subsite@@@posters,,,"><img src="http://www.discshop.se/shop/img/omslag/front_small/7/80517.jpg" alt="" border="0" height="55" hspace="0" vspace="0" width="38"></a> </div>
<div class="ds_l_d" style="height: 65px; width: 75px;">
2010-04-01 </div>
<div class="ds_l_h" style="width: 215px; height: 65px;">
<a href="ds.php?red=ds_produkt.php&&arg=id@@@80517,,,lang@@@se,,,subsite@@@posters,,," title=""><b>Poster: Friends</b>
</a>
<br>
Central Perk </div>
<div class="ds_l_b" style="height: 65px;">
<a href="http://www.discshop.se/shop/ds.php?red=search_solr.php&&arg=kopt@@@1,,,ds_action@@@ds_kundvagn,,,action@@@ds_kundvagn_laggtill,,,id@@@,,,action_id@@@80517,,,soktext@@@friends,,,sok_typ@@@titel,,,genre@@@,,,rec@@@0,,,cont@@@,,,sort@@@relevans,,,favorit_id@@@,,,favorit_typ@@@,,,lang@@@se,,,subsite@@@posters,,,"><img src="img/design/v5/knappar/kop_1_se.gif" alt="Klicka för att lägga varan i din kundvagn." align="absmiddle" border="0"></a> </div>
<div class="ds_l_p" style="height: 65px; width: 50px;">
<b><span class="price_normal">129:-</span></b>
</div>
</div>
Har försökt en del själv, men får bara ut namnet och priset, (fast det visas inte rätt).
testa följande:
preg_match("/>(\d+) träffar<.*>Poster: (.+)<.*>(\d+):-/sU", $buff, $match);
Tack för svaret.
Tyvärr var det inte det resultatet jag hade tänkt mig.
Som det är nu, så hämtas detta:
<a href="ds.php?red=ds_produkt.php&&arg=id@@@80517,,,lang@@@se,,,subsite@@@posters,,," title=""><b>Poster: Friends</b></a>
Vill plocka ut namn, beskrivning, pris och bild i ren text. (se bild)
Gäller den första sektionen på sidan nedan:
http://www.discshop.se/shop/search_solr.php?ref=&subsite=posters&lang=se&soktext=friends&x=0&y=0&sok_typ=titel
Någon som har lite tid över, och är sugen på att hjälpa mig med ovanstående?
Det bästa tipset vore att inte parsea html med regexp, utan använda en riktig parser istället.
Det accepterade svaret på den här frågan (den som börjar med "You can't parse [X]HTML with regex"), ger en hel del skäl till varför. Det finns en hel del olika parsers att använda.
Här är en som är riktigt snabb då den nyttjar libxml, du kan sedan använda DOMXpath för att fråga efter dina taggar. Det finns ett jättebra exempel på det i kommentaren av Mark Omohundro
Om du mot förmodan inte skulle ha tillgång till libxml kan du prova PHP Simple HTML DOM Parser, med dess dokumentation.
Fortsätter du försöka parsea html med regexp kommer du att stöta på problem.
Testade "PHP Simple HTML DOM Parser", men fick inte deras exempel att fungera.
"DOMXpath" är för avancerat för mig i detta skede.
Några andra förslag på hur man lättare kan parse:a text från olika webbplatser?
Hur mycket testade du då? Det är lite svårt att hjälpa till om du inte berätta vad du har provat och vilken kod du använde.
DOMXPath är inte så svårt, det kan se lite tungt ut i början, men när man har skrivit ett par xpath-uttryck brukar det vara ganska enkelt. Det finns dessutom hjälpverktyg som kan underlätta att hitta xpath-uttryck. Typ: https://addons.mozilla.org/en-US/firefox/addon/1095/ det brukar dock vara en bra idé att ändra lite i uttrycket man får fram så det blir mer generellt.
Hur mycket testade du då?
Jag testade alla exempel, rakt av, som fanns med i paketet.
Hej igen...
Hur skulle det kunna se ut med DOM om jag t.e.x. skulle vilja plocka ut alla produktbilder, produktnamn och pris från länken nedan?
http://butiken.svt.se/system/search/search.asp?b=1
(Bara så att jag kan se hur det fungerar, samt hur jag bygger upp det hela.)
*bump*
Hej igen...
Hur skulle det kunna se ut med DOM om jag t.e.x. skulle vilja plocka ut alla produktbilder, produktnamn och pris från länken nedan?
http://butiken.svt.se/system/search/search.asp?b=1
(Bara så att jag kan se hur det fungerar, samt hur jag bygger upp det hela.)
Någon som kan hjälpa mig med detta?
Finns det någon som kan förklara varför följande kod endast ger ETT resultat, (fast att det finns flera).
$html = file_get_contents('http://butiken.svt.se/system/search/search.asp?b=1&container=42');
preg_match_all("/class='productname'(.*?)'>(.*?)<\/a><div\sclass='productprice'><b>(.*?)\skr<\/b>/imxU", $html, $namn, PREG_SET_ORDER);
print("<h2>Prisuppgifter - SVT Butiken</h2>");
print("<table><thead><tr><th>Namn</th><th>Pris</th></tr></thead>");
foreach($namn as $key)
{
print("<tbody><tr><td>" . $key[2] . "</td><td>" . $key[3] . "</td></tr></tbody>");
}
print("</table>");
EDIT: Tog bort "U", och nu visas alla resultat.
(Man lär så länge man lever.)
Hej igen...
Hur skulle det kunna se ut med DOM om jag t.e.x. skulle vilja plocka ut alla produktbilder, produktnamn och pris från länken nedan?
http://butiken.svt.se/system/search/search.asp?b=1
(Bara så att jag kan se hur det fungerar, samt hur jag bygger upp det hela.)
Prova själv och posta kod när du fastnat.