| 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 |
#2 · Zasláno: 8. 8. 2011, 10:43:30 · Upravil/a: peta
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 869,– Kč //!jak jsem predpokladal, nbsp |
||
| Demogorgon Profil * |
#3 · Zasláno: 8. 8. 2011, 13:32:49
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,– Kč čili bez   v ceně. Jakto? Mimochodem, můj regulérní výraz mi nefunguje ani v případě, že počítám s  . Vůbec nechápu v čem by mohla být chyba :/. |
||
| Demogorgon Profil * |
#4 · Zasláno: 8. 8. 2011, 14:01:15
Už to mám - ve zdrojovém kódu výběru ano, tam je  , ale ve zdrojovém kódu celé stránky nikoli. Můj výraz je
/(class=\"price \">)+\s{4}+\d{1,3}+ +\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 |
#5 · Zasláno: 9. 8. 2011, 12:54:33
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 |
#6 · Zasláno: 9. 8. 2011, 17:38:12
Demogorgon:
Mně fungovalo tohle, varianty s entitou i obyč.mezerou. preg_match('~<div\s+class="\s*price\s*">\s*(\d+?)(?:\s| )*(\d+)?\D*Kč~isU', $a, $m);
var_dump($m); |
||
|
Časová prodleva: 15 let
|
|||
0
).