Autor | Zpráva | ||
---|---|---|---|
dajusa Profil |
#1 · Zasláno: 21. 7. 2008, 15:15:27 · Upravil/a: dajusa
Zdravím Vás,
dostal jsem za úkol zpracování nějakých dat do pdf pomocí php. Mám ale problém s jednou věcí. Když si vytáhnu jeden údaj z databáze je to HTML kód, který mi vypíše tabulku. uVedu pouze příklad: <table border = on><tr><td><font size = 2>Síť</font></td><td><font size = 2> Ve špiččce<br/>(min)</font></td><td><font size = 2>Mimo špičku</br> (min)</font> </td><td><font size = 2>Z toho volných<br/> minut</font></td><td><font size = 2>Cena v Kč<br/>(bez DPH)</font></td></tr></table> Potřeboval bych si toto co vytáhnu z databáze rozdělit na jednotlivé části, dá se říct že v podstatě pod každý index v poli uložím obsah jedné buňky tabulky. Akorát nevím jak na to. Napadá mě to řešit nějakým regulérním výrazem, ale nemůžu přijít na to jakým. Jediné co mě napadá je že v podstatě bych vytahoval údaj mezi znaky ></ ale jen za podmínky že mezi nimi je nějaký text. Poradíte mi plsky Díky moc |
||
nightfish Profil |
#2 · Zasláno: 21. 7. 2008, 15:19:20
preg_match_all("/<td>(.*)</td>/U", $retezecSTabulkou, $vystup) a pak se podívej na obsah pole $vystup... |
||
dajusa Profil |
#3 · Zasláno: 21. 7. 2008, 15:33:12
nightfish
dekuju vypada to fajn ale mam problem kdyz to udelam tak jak mi pises tak mi to hodi chybu kod mam takto: $pokus = "<table border = on><tr><td><font size = 2>Síť</font></td><td><font size = 2> Ve špiččce<br/>(min)</font></td><td><font size = 2>Mimo špičku</br> (min)</font> </td><td><font size = 2>Z toho volných<br/> minut</font></td><td><font size = 2>Cena v Kč<br/>(bez DPH)</font></td></tr></table>"; preg_match_all("/<td>(.*)</td>/U", $pokus, $vystup); die($vystup[0]); A vyhodi to tuto chybu resp. varovani: Warning: preg_match_all() [function.preg-match-all.html]: Unknown modifier 't' in C:\ComplexWebServer\http_docs\html2pdf\html2pdf\genfakt.php on line 43 |
||
Matty Profil |
#4 · Zasláno: 21. 7. 2008, 15:36:23
dajusa
Zkus tohle: preg_match_all("/<td>(.*)<\/td>/U", $retezecSTabulkou, $vystup); |
||
BetaCam Profil |
#5 · Zasláno: 21. 7. 2008, 15:38:46
preg_match_all("/<td>(.*)<\/td>/U", $retezecSTabulkou, $vystup)
|
||
dajusa Profil |
#6 · Zasláno: 21. 7. 2008, 15:44:10
tak jo uz mi to neco vypisuje ale uz to neni ono.
melo by to fungovat tak ze kdyz ted dam die($vystup[0][0]); die($vystup[0][1]); co s tím? a taky by mě zajímalo proč z toho udělá více stupňové pole |
||
nightfish Profil |
#7 · Zasláno: 21. 7. 2008, 15:59:52
dajusa
sry, zapomněl jsem "escapovat" jedno lomítko, proto ta chyba die($vystup[0][0]); doporučuji tvé pozornosti konstrukci echo $vystup[0][0]; používání Die() pro výpis textu mi přijde dosti nešikovné a taky by mě zajímalo proč z toho udělá více stupňové pole protože můžeš mít obecně víc podřetězců (částí ohraničených závorkami v regulárním výrazu) a každý takový podřetězec se může nacházet vícekrát v prohledávaném řetězci měl by vypsat Ve špiččce (min) ale místo toho vypisuje až Z toho volných minut:( pokud tam mohou být i odřádkování, je potřeba přidat modifikátor "s" takže preg_match_all("/<td>(.*)<\/td>/Us", $retezecSTabulkou, $vystup); a výpis foreach ($vystup[1] as $v) { echo $v."<br>"; } |
||
dajusa Profil |
#8 · Zasláno: 23. 7. 2008, 08:15:35
nightfish
diky moc to je presne to co potrebuju...jde o to ze klasickym vystupem je uz pdf s urcitymi daty...proto pred vlastni generovani do pdf davam die($vystup[0][0]); |
||
dajusa Profil |
#9 · Zasláno: 23. 7. 2008, 08:17:25
jeste me napada jeden dotaz k tomuto tematu...moc se v regulernich vyrazech nevyznam a proto se ptam jak nubik...jde udelat nejak i to ze to vybere to co ted to znamena jednu bunku s tabulky ale zaroven to do pole ulozi bez tagu <td></td>?
|
||
nightfish Profil |
jde udelat nejak i to ze to vybere to co ted to znamena jednu bunku s tabulky ale zaroven to do pole ulozi bez tagu <td></td>?
přesně to to dělá, podívej se na $vystup[1][0], $vystup[1][1], $vystup[1][2], ... |
||
dajusa Profil |
#11 · Zasláno: 23. 7. 2008, 08:50:58
nightfish
no kdyz si to vypisu na stranku tak to vypise bez tech tagu, ale kdyz si dam zobrazit zdrojovy kod tak je to ulozene i s tagy <td></td> |
||
nightfish Profil |
#12 · Zasláno: 23. 7. 2008, 08:54:37
dajusa
tento kód mi to vypisuje bez <td> a </td>... jak jsem řekl - první index toho pole musí být "1" a ne "0" <?php $pokus = "<table border = on><tr><td><font size = 2>Síť</font></td><td><font size = 2> Ve špiččce<br/>(min)</font></td><td><font size = 2>Mimo špičku</br> (min)</font> </td><td><font size = 2>Z toho volných<br/> minut</font></td><td><font size = 2>Cena v Kč<br/>(bez DPH)</font></td></tr></table>"; preg_match_all("/<td>(.*)<\/td>/Us", $pokus, $vystup); echo "<pre>"; print_r($vystup[1]); echo "</pre>"; ?> |
||
dajusa Profil |
#13 · Zasláno: 23. 7. 2008, 08:57:33
nightfish
aha tak v tom byla chyba...a proc nemuze byt ten index 0? je to nubicka otazka ale zajimalo by me to proc to zacina az od jednicky byt tak jak to ma... |
||
nightfish Profil |
#14 · Zasláno: 23. 7. 2008, 09:04:59
a proc nemuze byt ten index 0? je to nubicka otazka ale zajimalo by me to proc to zacina az od jednicky byt tak jak to ma...
ono je to v celku logické... když uděláš preg_match se dvěma podřetězci, např. preg_match("/(.*)defgh(.*)/", "abcdefghijkl", $regs), tak pole $regs bude obsahovat: index 0 - celý řetězec, který odpovídá "zpárované části" regulárního výrazu (v našem případě "abcdefghijkl") index 1 - bude obsahovat řetězec, který odpovídá prvnímu uzávorkovanému výrazu (v našem případě "abc") index 2 - bude obsahovat řetězec, který odpovídá druhému uzávorkovanému výrazu (v našem případě "ijkl") ... preg_match_all se liší jen tím, že vrací více výsledků (preg_match jen jeden) pro uložení výsledků do pole je nutný další rozměr a výchozí nastavení preg_match_all je takové, že ukládá do $vystup[0] - všechny celé řetězce, které odpovídají "zpárované části" RV $vystup[1] - všechny řetězce, odpovídající první závorce... a v každém takovémto poli jsou postupně od 0 indexovány jednotlivé nalezené řetězce |
||
dajusa Profil |
#15 · Zasláno: 23. 7. 2008, 09:07:56
diky moc za vysvetleni;)
|
||
Časová prodleva: 16 let
|
0