IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Martin Tahoma:25.9.2019 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.9.2019 12:33
 
Odpovědět
25.9.2019 12:31
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26.9.2019 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.9.2019 9:36
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26.9.2019 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.9.2019 15:48
 
Nahoru Odpovědět
26.9.2019 15:46
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26.9.2019 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.9.2019 15:52
Avatar
Odpovídá na Martin Tahoma
Neaktivní uživatel:26.9.2019 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.9.2019 17:14
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Martin Tahoma:4.10.2019 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.10.2019 16:35
Avatar
Odpovídá na Martin Tahoma
Neaktivní uživatel:6.10.2019 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.10.2019 19:14
Neaktivní uživatelský účet
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7.10.2019 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.10.2019 8:13
Avatar
Odpovídá na Peter Mlich
Martin Tahoma:7.10.2019 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.10.2019 10:07
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7.10.2019 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.10.2019 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.