webForumDet fria alternativet

Två array:s i loop?

19 svar · 1 176 visningar · startad av Guldstrand

GuldstrandMedlem sedan juli 20041 274 inlägg
#1

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.

The_HulkMedlem sedan juni 20031 937 inlägg
#2

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?

GuldstrandMedlem sedan juli 20041 274 inlägg
#3

The_Hulk skrev:

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.

The_HulkMedlem sedan juni 20031 937 inlägg
#4

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.

GuldstrandMedlem sedan juli 20041 274 inlägg
#5

The_Hulk skrev:

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);
GuldstrandMedlem sedan juli 20041 274 inlägg
#6

*bumpellibump*
:r

The_HulkMedlem sedan juni 20031 937 inlägg
#7
foreach($pris as $key => $val)
{
    echo "namn: " . $namn[$key][1] . ", pris: " . $val[1] . ", besk: " . $besk[$key][1] . "\n";
}
GuldstrandMedlem sedan juli 20041 274 inlägg
#8

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 &amp; 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=&amp;lang=se&amp;subsite=posters&amp;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&amp;&amp;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&amp;&amp;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&amp;&amp;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).

dump.PNG
The_HulkMedlem sedan juni 20031 937 inlägg
#9

testa följande:

preg_match("/>(\d+) träffar<.*>Poster: (.+)<.*>(\d+):-/sU", $buff, $match);
GuldstrandMedlem sedan juli 20041 274 inlägg
#10

The_Hulk skrev:

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&amp;&amp;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

parsa_screen.png
GuldstrandMedlem sedan juli 20041 274 inlägg
#11

Någon som har lite tid över, och är sugen på att hjälpa mig med ovanstående?

colioneMedlem sedan juni 20013 386 inlägg
#12

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.

GuldstrandMedlem sedan juli 20041 274 inlägg
#13

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?

colioneMedlem sedan juni 20013 386 inlägg
#14

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.

GuldstrandMedlem sedan juli 20041 274 inlägg
#15

colione skrev:

Hur mycket testade du då?

Jag testade alla exempel, rakt av, som fanns med i paketet.

GuldstrandMedlem sedan juli 20041 274 inlägg
#16

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.)

GuldstrandMedlem sedan juli 20041 274 inlägg
#17

*bump*

GuldstrandMedlem sedan juli 20041 274 inlägg
#18

Guldstrand skrev:

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?

GuldstrandMedlem sedan juli 20041 274 inlägg
#19

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.)

colioneMedlem sedan juni 20013 386 inlägg
#20

Guldstrand skrev:

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.

Genererad på 374 ms · cache AV · v20260730165559-full.f96bc7eb