Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: preg_match ja div-tagin sisältö

Sivun loppuun

lrp [02.05.2009 15:06:57]

#

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">&nbsp;</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

trilog [02.05.2009 15:41:22]

#

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">&nbsp;</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.

Teuro [02.05.2009 15:41:30]

#

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;
?>

Metabolix [02.05.2009 16:46:47]

#

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.

Rocceri [02.05.2009 17:01:02]

#

Kerrassaan kiinnostava aihe; Pystisikö tällä tavalla myös tekemään niin, että echottaa jonkin muun sivun lähdekoodista tietyn nimisen meta tagin?

lrp [02.05.2009 17:13:21]

#

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!

Metabolix [02.05.2009 17:59:45]

#

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

lrp [02.05.2009 18:33:33]

#

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

tsuriga [02.05.2009 19:32:15]

#

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.

Teuro [02.05.2009 19:40:42]

#

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.

Metabolix [02.05.2009 19:54:30]

#

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.

Teuro [02.05.2009 20:00:09]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta