Tällainen muuttuja
<?php $teksti2='fsdfsd <div id="ArtikelnamnFalt">Sloow Protein, 1 kg</div> asdfasfd';
Tarkoitus kaivaa noiden tägien välissä oleva teksti
näin se löytyy:
<?php preg_match_all("/<div id=.ArtikelnamnFalt.>(.*?)\\<\\/div>/", $teksti2, $tiedot); var_dump ($tiedot);
tulostaa hienosti
array(2) { [0]=> array(1) { [0]=> string(51) " Sloow Protein, 1 kg " } [1]=> array(1) { [0]=> string(19) "Sloow Protein, 1 kg" } }
Osaako joku selittää tuon tulostuksessa tulevat pari rivinvaihtoa string(51) "-rivillä ja Sloow Protein, 1 kg-rivillä
Sitten vielä tuskaisempi juttu. Kun luen url:n sisällön muuttujaan ja koitan kaivaa sieltä ton saman jutun niin eipäs onnistukkaan. Eli teen näin
<?php $contents = file_get_contents('http://www.fitnesstukku.fi/cgi-bin/ibutik/AIR_ibutik.fcgi?Avd=5&funk=visa_artikel&artnr=7020r'); //ja haku yritys preg_match_all("/<div id=.ArtikelnamnFalt.>(.*?)\\<\\/div>/", $contents, $tiedot); var_dump ($tiedot); echo "<br><br>";
ja tulostuu
array(2) { [0]=> array(0) { } [1]=> array(0) { } }
Kun katsoo ton urlin lähdekoodia niin sieltä löytyy tällainen kohta
<td rowspan="2" class="Artgrp_Avd_Vert"> </td> <td align="left"><div id="ArtikelnamnFalt"> Sloow Protein, 1 kg </div></td>
Haittaako etsinnän tekoa rivinvaihdot urlin lähdekoodissa?
Mod. lisäsi kooditagit
lrp kirjoitti:
Haittaako etsinnän tekoa rivinvaihdot urlin lähdekoodissa?
Kyllä haittaa, etsintä katkeaa siihen. Voit kokeilla seuraavaa:
<?php $str = '<td rowspan="2" class="Artgrp_Avd_Vert"> </td> <td align="left"><div id="ArtikelnamnFalt"> Sloow Protein, 1 kg </div></td>'; $m = null; preg_match('/\<div id="ArtikelnamnFalt"\>(.+)\<\/div\>/s', $str, $m); var_dump($m); ?>
Tässä regexp ei välitä rivinvaihdoista.
Eikös noiden välisen tekstin saisi ihan DOM rajapinnan kautta helpommin, koska et kuitenkaan saa kuin yhden ainoan solmun kiinni.
<?php $haettavaId = "ArtikelnamnFalt"; $haettuSolmu = $doc->getElementById($haettavaId); echo $haettuSolmu->textContent; ?>
lrp kirjoitti:
tulostaa hienosti
array(2) { [0]=> array(1) { [0]=> string(51) " Sloow Protein, 1 kg " } [1]=> array(1) { [0]=> string(19) "Sloow Protein, 1 kg" } }Osaako joku selittää tuon tulostuksessa tulevat pari rivinvaihtoa string(51) "-rivillä ja Sloow Protein, 1 kg-rivillä
Itse asiassa tulostus on seuraava:
array(2) { [0]=> array(1) { [0]=> string(51) "<div id="ArtikelnamnFalt">Sloow Protein, 1 kg</div>" } [1]=> array(1) { [0]=> string(19) "Sloow Protein, 1 kg" } }
Jos tulostat tuon sellaisenaan HTML:n sekaan, homma menee tietenkin pieleen, koska div-tagi näkyy tekstin sijaan div-elementtinä, jota oletusarvoisesti edeltää ja seuraa rivinvaihto.
Kokeilepa tällaista var_dump-funktiota:
<?php function ob_htmlspecialchars($str) { return htmlspecialchars($str); } function var_dump_html() { ob_start("ob_htmlspecialchars"); foreach (func_get_args() as $a) { var_dump($a); } ob_end_flush(); } $sisalto = 'alku <div id="ArtikelnamnFalt">teksti</div> loppu'; preg_match_all('#<div id="ArtikelnamnFalt">(.*?)</div>#s', $sisalto, $tiedot); var_dump_html($tiedot); ?>
Teuron ehdotus on muuten hyvä, mutta jos sivu on virheellisesti rakennettu (vakavasti epävalidi), se ei tietenkään toimi.
Kerrassaan kiinnostava aihe; Pystisikö tällä tavalla myös tekemään niin, että echottaa jonkin muun sivun lähdekoodista tietyn nimisen meta tagin?
trilog kirjoitti:
lrp kirjoitti:
Haittaako etsinnän tekoa rivinvaihdot urlin lähdekoodissa?
Kyllä haittaa, etsintä katkeaa siihen. Voit kokeilla seuraavaa:
<?php $str = '<td rowspan="2" class="Artgrp_Avd_Vert"> </td> <td align="left"><div id="ArtikelnamnFalt"> Sloow Protein, 1 kg </div></td>'; $m = null; preg_match('/\<div id="ArtikelnamnFalt"\>(.+)\<\/div\>/s', $str, $m); var_dump($m); ?>Tässä regexp ei välitä rivinvaihdoista.
Kiitos, kokeilin tota. Se "löytää" koko lopputiedoston tuon div tagin jälkeen.
Kun tein näin
<?php preg_match('/\<div id="ArtikelnamnFalt"\>(.+)\<\/div\>/sU', $contents, $m); ?>
Löytyi vähän vähemmän. Sama lopputulos taitaa tulla
<?php preg_match('/\<div id="ArtikelnamnFalt"\>(.+?)\<\/div\>/s', $contents, $m); ?>
Eli preg_match on kait oletuksena "ahne" ja tolla /U tai lisäämällä ton kyssärin saa funktiosta "epäahneen"
Mod. lisäsi taas kooditagit!
lrp kirjoitti:
Eli preg_match on kait oletuksena "ahne" ja tolla /U tai lisäämällä ton kyssärin saa funktiosta "epäahneen"
Ei, vaan * ja + ovat säännöllisissä lausekkeissa ahneita operaattoreita, ja niistä saa laiskoja lisäämällä perään ?:n. Jo aiemmassa viestissäni on toimiva lauseke, ja se on vieläpä yksinkertaisemmin (ilman turhia kenoviivoja) kirjoitettu. Tässä vielä kertauksen vuoksi:
preg_match_all('#<div id="ArtikelnamnFalt">(.*?)</div>#s', $sisalto, $tiedot);
Metabolix kirjoitti:
lrp kirjoitti:
Eli preg_match on kait oletuksena "ahne" ja tolla /U tai lisäämällä ton kyssärin saa funktiosta "epäahneen"
Ei, vaan * ja + ovat säännöllisissä lausekkeissa ahneita operaattoreita, ja niistä saa laiskoja lisäämällä perään ?:n. Jo aiemmassa viestissäni on toimiva lauseke, ja se on vieläpä yksinkertaisemmin (ilman turhia kenoviivoja) kirjoitettu. Tässä vielä kertauksen vuoksi:
preg_match_all('#<div id="ArtikelnamnFalt">(.*?)</div>#s', $sisalto, $tiedot);
En saanut tätä toimimaan vaikka tein tällaisen muokkauksen
preg_match_all('/<div id="ArtikelnamnFalt">(.*?)<\/div>/s', $sisalto, $tiedot);
Mutta tämä vaikuttaa lupaavalta
preg_match('/<div id="ArtikelnamnFalt">(.+)<\/div>/sU', $contents, $m);
Metabolix kirjoitti:
Teuron ehdotus on muuten hyvä, mutta jos sivu on virheellisesti rakennettu (vakavasti epävalidi), se ei tietenkään toimi.
Virheherkkyyttä voi parantaa ajamalla lähdekoodin Tidyn läpi. Täyttä höttöä ei tuokaan toki korjaa.
tsuriga kirjoitti:
Metabolix kirjoitti:
Teuron ehdotus on muuten hyvä, mutta jos sivu on virheellisesti rakennettu (vakavasti epävalidi), se ei tietenkään toimi.
Virheherkkyyttä voi parantaa ajamalla lähdekoodin Tidyn läpi. Täyttä höttöä ei tuokaan toki korjaa.
Osaltaan tuon virheherkkyyden takia DOM on minusta mukava, koska siinä jää heti kiinni, jos sivu ei ole hyvin muodostettu.
Teuro kirjoitti:
Osaltaan tuon virheherkkyyden takia DOM on minusta mukava, koska siinä jää heti kiinni, jos sivu ei ole hyvin muodostettu.
Näin on, mutta tässäpä taitaa olla tarkoitus hakea tietoa jonkun muun tekemältä sivulta, jolloin sivun virheisiin ei voi itse vaikuttaa. Omasta verkkokaupasta tuskin tarvitsisi preg_matchilla tai DOMilla lähteä tuotteen nimeä etsimään, vaan sen saisi helpommalla suoraan tietokannasta.
Jes juuri näin lienee asia, mutta voihan datan lukea HTML:Ä tidyn läpi. Tuokaan ei taida kuitenkaan ihan sontaa sulattaa. Huomasin asian oikein hyvin, kun yritin lukea valioituneita mansseja kennelliiton sivuilta, mutta oli pakko hylätä asia, kun ei sitä roskaa voinut lukea mitenkään varmasti.
Aihe on jo aika vanha, joten et voi enää vastata siihen.