Autor Zpráva
Demogorgon
Profil *
Ahoj, jsem tak trochu začínající a hlavně tápající člověk. Prosím o radu.

Podle návodu jsem si zkoušel vytvořit kód pro vytažení údaje (ceny produktu) z html stránky, ale netuším, jak správně zapsat regulérní výraz, rsp. na testovacím stringu mi funguje, v praxi už nikoli. Hledaný řetězec v html vypadá takto:

class="price ">
            24 869

program je:

<?php
        
        if (!$fp = fopen("http://beta.czc.cz/acer-aspire-timelinex-5830tg-2628g75mnbb-15-6-i7-2620m-8g-750gb-gt540m-w7hp/93388/produkt", "r")) {     //To jen pro příklad, chová se to vždy stejně
            return false;
        }
        $content = "";

        while (!feof($fp)) { 
            $content .= fgets($fp);
        }
        fclose($fp); 
        
        preg_match_all("/(class=\"price \">)+\s{4}+\d{1,3}\s\d{3}/", $content, $prices); 

?>


$prices pak neočekávaně obsahuje prázdné pole. Problém je, zdá se, v mezeře mezi čísly, tj, 24 869. Pokud smažu regulérní výraz po poslední mezeře, tak funguje (tj. po smazání \s\d{3} se v poli zobrazí '24', v opačném případě nic).

Co dělám špatně? Děkuji za každou radu ;).

Moderátor Majkl578: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
peta
Profil
Nebylo by jednodussi pozadat firmu, aby ti dala odkaz na xml z toho shopu? Jiste pro zbozi.cz nebo jine hromadne obchody generuji takove xml verejne pristupne. Pak pres parse_xml nebo, jak se to dela, si z toho vyberes presne, co chces. A kdyz je to spatne, muzou za to oni :)

http://www.regexp.cz/

class="price ">
            24 869
(class=\"price \">)+\s{4}+\d{1,3}\s\d{3}

1. to mas viceradkove, asi by tam mel byt modifikator
2. price nemusi mit vzdy na konci mezeru, muze to byt jeden z class, treba uprostred
3. \s{4}+\d{1,3}\s\d{3} = 4 mezery 1-nkrat, 1-3 cisla, mezera, 3 cisla, no jo, ale, co kdyz je tam nbsp nebo mezer vic? A co kdyz je tam milion?
\s+[\d. ]+
[^<]* //vytahnout cely string a pres replace si uz nbsp nahradis mezerou a provedes, co potrebujes. Nebo pouzij callback.


Tohle je html kod z te stranky aceru, dobre, zes to sem dal :) Vybral jsem jen tu cast kolem velke sumy. Dival ses vubec do html nebo jen tipujes?
<td class="price"> //!CLASS PRICE
			                    	
        <div class="priceProgress stag" title="Vývoj ceny"></div>
    
		<div class="price ">
			24&nbsp;869,–&nbsp;Kč //!jak jsem predpokladal, nbsp
Demogorgon
Profil *
peta:
Díky moc za reakci.

Pár komentů: Nejde mi konkrétně o tuto cenu. Je mi i jedno, že by tam mohl být milion nebo více mezer. Nevytvářím 'ostrou' aplikaci - učím se. Až vyřeším toto, rozvedu to třeba dále :).

Do HTML jsem se díval ale vidím pouze toto:
<div class="price ">
			24 869,–&nbsp;Kč

čili bez &nbsp v ceně. Jakto? Mimochodem, můj regulérní výraz mi nefunguje ani v případě, že počítám s &nbsp. Vůbec nechápu v čem by mohla být chyba :/.
Demogorgon
Profil *
Už to mám - ve zdrojovém kódu výběru ano, tam je &nbsp, ale ve zdrojovém kódu celé stránky nikoli. Můj výraz je
/(class=\"price \">)+\s{4}+\d{1,3}+&nbsp;+\d{3}+/


Pokud ho aplikuji na proměnou obsahující zkopírovaný html kód uvedený v [#3] , tak mi funguje. Na obsah $content už ne.
peta
Profil
Demogorgon: Pak je otazka, co mas v tom contentu? Treba je neco ulozene pres addslashes, nebo htmlentities
print_r
var_dump
fwrite (to je nejjistejsi, asi)

text, necislo*, cislo+, necislo+, cislo+
(class=\"price \">)\D+(\d)+(\D+(\d+))+
(class=\"price \">)\D*(\d)+(?:\D+(\d+))+ //v JS
A proc proste nepouzijes neco takoveho? Nevim, jak se ted ale v php dela pasivni vyraz (zavorka, kterou nedava do matches). Zalezi ti na tom, ze to musi byt nutne mezera a tak?
Tori
Profil
Demogorgon:
Mně fungovalo tohle, varianty s entitou i obyč.mezerou.
preg_match('~<div\s+class="\s*price\s*">\s*(\d+?)(?:\s|&nbsp;)*(\d+)?\D*Kč~isU', $a, $m);
var_dump($m);
Ale asi by to šlo napsat i stručněji.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0