Java týden Body zdarma
Využij podzimních slev a získej od nás až 40 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!

Diskuze: Jak přidat custom HTML za <body*>?

Aktivity (2)
Avatar
Martin Tahoma:25. září 12:31

Ahoj všem,

prosím o pomoc/rady/tipy. Jak udělat skript, který předsouvám přímo webserverem všem webům na serveru pomocí PHP konfigurační proměnné "auto_prepend_fi­le", kdo nezná představte si to jako funkci Include() na začátek každého souboru.

Script by měl automaticky přidávat na všech webech custom HTML kód za počáteční <body*> tag, aniž by to rozbilo aplikaci.

Zkusil jsem: Zkoušel jsem kombinaci funkce ob_start a HTML parseru, ale to mi přišlo zbytečně složité. Navíc by se do bufferu načítaly velmi dlouhé zdrojové kódy, což by mohlo pravděpodobně zbytečně zatěžovat server.

Nyní se snažím pomocí ob_start načíst zdrojový kód do bufferu v něm pomocí regulárního výrazu najít <body*> tag, následně za něj přidat custom HTML kód.

Můj aktuální kód vypadá takto. Problém je v tom, že funkce callback nějak naprosto ignoruje to pole. Nelze ani vypsat obsah pole pomocí funcí print_r či var_dump.

<?php
function callback($buffer)
{
        $htmlDocument = $buffer;
        $pattern = '[<]body[^>]*[>]';
        $matches = array();
        preg_match($pattern, $htmlDocument ,$matches)
        $puvodniBody = array_shift(array_values($matches));
        $replacement = "$puvodniBody . MOJE HTML";
        print(preg_replace($pattern, $replacement, $htmlDocument ));
        //v prohlížeči by se mělo vypsat něco jako <html bla bla bla<body bla bla>
MOJE HTML bla bla bla</html>
}

ob_start("callback");
//do zápatí webu ještě strkám ukončení ob_end_flush();
?>

Chci docílit: Snažím se dosáhnout toho, aby někdo, kdo je zkušenější programátor se mi mrknul na můj krátký kód a případně mi sdělil, kdy tam viděl nějakou nesrovnalost. Syntax checkerem to prošlo bez problému. Nejspíš to také řeším špatně, třeba existuje jednodušší cesta jak přilepit vlastní HTML za body, než pomocí kombinace preg_match a preg_replace, ale žádnou funkci preg_append jsem nenašel.

Děkuji moc všem za rady.

Editováno 25. září 12:33
 
Odpovědět 25. září 12:31
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26. září 9:36
  1. Body tag neni povinny.
  2. Body tag nemusi byt pouzit jen jednou. A jsou pripady kdy se pouziva prave opakovane. Treba phpmyadmin to pouziva pro import vetsich souboru (nebo to je nejaky externi program v php)
  3. To ostatni vypada, ze by mohlo fungovat, pokud najde tag body. Ti lepsi by pouzili hned replace "$1 muj html kod" nebo preg_replace_ca­llback, pokud by to neslo napsat primo do preg_replace.
  4. Je velmi pravdepodobne, ze takhle rozbijes cely web (u starsich webu). Css muze mit ostylovane body a html tagy. Pocitat s konkretni vyskou zhora pro position nebo marginy a ty jim ted neco pridas a zacne se jim stranka formatovat jinak. Zalezi na tom... Pokud s tim pocitaji pri navrhu, pak je to ok.

Sak, zapomen chvilku na ob_start a zkus tam pridat testovaci kod, pak zdroj + vystup vypisuj pres htmlspecialchars a uvidis, co to dela, ne? (pridani baneru)
Ja mam pocit, ze tyhle veci se delaji v .htaccess, mozna linuxem, na serverech, ze to do php snad ani nejde. Ale musel bych zkusit googlovat. Jeste jsem nic tekoveho nepotreboval.

 
Nahoru Odpovědět 26. září 9:36
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26. září 15:46

tak, oprava, 3.

$pattern = '[<]body[^>]*[>]'; - je spatne, viz forko programujte.com, to mi rano nedoslo
$pattern = '~[<]body[^>]*[>]~';
$pattern = '/[<]body[^>]*[>]/'; // nebo takto, a porom mas na programujte jeste to body velkymi pismeny
$pattern = '~[<]body[^>]*[>]~im'; // a multiline, vice radku, nekonci u privniho \n
Editováno 26. září 15:48
 
Nahoru Odpovědět 26. září 15:46
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26. září 15:52

Hej, sak v nejhorsim muzes pouzit strpos. Najit <body a od te pozice prvni >. A ziskas pozici, kam muzes pridat dalsi kod. Potom to cele zplacat pres substr
substr($html,0,­$pos).'mujkod'­.substr($html,$p­os+1)

 
Nahoru Odpovědět 26. září 15:52
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na Martin Tahoma
Daniel Vítek:26. září 17:14

Nevim jak teď, ale před několika lety toto webhosting Endora neřešil, a dával to naopak na konec každého souboru. Hezky za </html>. Kód byl sice W3C nevalidní, ale dnešní prohlížeče si s tím bez problému poradí.

Nahoru Odpovědět 26. září 17:14
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na Daniel Vítek
Martin Tahoma:4. října 16:35

Peter Mlich: Děkuji ti moc, že sis dal s tím tolik práce a zamyslel se nad mým problémem. Nicméně, došlo mi, že ta cesta PHP a načítání obsahu celých HTML dokumentů do bufferu a nad tím provádění dalších operací by jen zpomalovalo načítání stránek a vyžíralo paměť na serveru.

Daniel Vítek: Tohle je hodně dobrá poznámka, děkuji ti. To by fungovalo, ale má to háček, je to v zápatí, já to potřebuji v záhlaví. Zkoušel jsem to pomocí absolutního pozicování CSS, ale to mi zakrývalo content webu. Musel bych hrabat do CSS konkrétního webu, což je podobný problém jako výše uvedený, chtělo by to zase nějak podvrhovat zdrojový kód pomocí PHP. Pak jsem to zkoušel přes javascript, aby to nezatěžovalo server, což se mi ale též nepovedlo, firefox nezpracovával </script> tak za koncovou značkou </html>, nebo mi to jen nefungovalo, nevím.

Kdyby tě napadlo, jak to z patičky dostat do zahlaví jednoduchým způsobem, byla by to pecka.

 
Nahoru Odpovědět 4. října 16:35
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na Martin Tahoma
Daniel Vítek:6. října 19:14

Zkus přiblížit o co konkrétního jde - nějaký banner?

Každopádně musíš počítat s tím, že i když to dostaneš hned za <body>, můžeš pak mít na webu navigaci, která bude mít fixní pozici nahoře, a to co ty si tam vložíš to stejně překryje. Případně tomu ten web může přes CSSko nastavit display: none a stejně se to nezobrazí.

Takže hodně záleží na konkrétním případu.

Nahoru Odpovědět 6. října 19:14
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7. října 8:13

Cele to reseni je podle mne uplne na prd. Neco podobne pouzival wz.cz. Ale, po te, co mi zrusili stranky, tak muzu takovy hosting jen nedoporucit. (jsem tam mel nejaky prehistoricky mail tusim peter@mail.tw, na strankach jsem mel vsude jine mail a ani se neobtezovali mi napsat na ne).

No, co chci rici, ze pridavat do kodu na stranky je spatna vec. Treba CMS to moc nemaji rady. Lepsi je dat uzivateli moznost rici, kde bude kod vkladan, jako to melo to wz.

<!-- reklama --><!-- /reklama -->

Nebo, jak pise Vitek, pouzil bych ale htaccess a pridal ten kod na konec. Mohla by tam byt moznost, tesne pred odeslanim uzivateli kod nejka upravit.

Co se tyce pozicovani, melo by stacit nastavit
<html>...</html>
<style>html, body {position:relative; margin:0; padding:0;}</style>
Dnesni prohlizece by to meli vzit. A nebo je mozne jeste pouzit vice body najednou. vim, ze jsem to videl pouzivat nekde u mysqldump.php, nejaky program pro import velkych sql souboru, ktere neslo protlacit pres phpmyadmin.php. Pouzivali to k vykreslovani progressbar.

 
Nahoru Odpovědět 7. října 8:13
Avatar
Odpovídá na Peter Mlich
Martin Tahoma:7. října 10:07

Daniel: Ano, banner.
Peter: To je zase sahání do vzhledu webu pomocí CSS, což ho může rozbít, možná sem nepochopil jak to myslíš.

Jde o to, že už sem tím zabil tolik hodin času, že nakonec jsem se rozhodl, že ten banner do záhlaví webu automaticky prostě dávat nejde. :-D

 
Nahoru Odpovědět 7. října 10:07
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7. října 15:01
  • To je komentar k tomu pozicovani. Ups, ja to tam nenapsal :) Kdyz nastavis position pro html, body, pak by melo byt celkem jiste, kde je x=0, y=0. Coz ale muze rozbit vzhled jejich css, mozna, trochu.
  • a pak je dalsi moznost, v css3 jde nastavit order.
  • je mozne pouzit iframe/objekt, stranku i baner dat zvlast do iframu. Krasne se to bude blokovat :)
  • Jeste je mozne dat baner do css. Dat margin-top pro body a vpasovat tam pres content="" nejaky text, pripadne obrazek pres background. Mozna vyuzit javascript, kvuli klikatelnosti.

Mas tolik moznosti :)

Jo, napadla mne takova finticka. Vpasovat tam js kod, ktery pri onmouseover provede onclick a presmeruje to do nejakeho neviditelneho iframu :) Vis, jakoze uzivatel neklikl, ale tobe to zapocita klik na reklamu

 
Nahoru Odpovědět 7. října 15:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.