Autor Zpráva
Broli
Profil
Potreboval bych poradit, jak efektivne odstranit netisknutelne znaky ze zacatku a koncu souboru, ktere nacitam do skriptu pomoci include ci require.
Pokud by se jednalo o retezec, tak lze pouzit trim, ale v priapade souboru?

Otvirani, nacitanu, uprava a opetovne ulozeni souboru a pote jeho nacteni pomoci include mi prijde ponekud tezkopadnym resenim.... Neexistuje neco snazsiho?
*Čvachta*
Profil *
Nepochopil jsem pokud něco includuješ, že z toho chceš odstranit mezery.. je to přece script ne?
Broli
Profil
pokud chci posilat xml hlavicku stranky, nesmi se pred deklaraci vyskytovat zadne (ani prazdne znaky). Soubory, ktere se includji (napr. config a dalsi) mohou mit na konci prazdny znak a v tom pripade se stranka nezobrazi... Vzhledem k jejich poctu si nemohu dovolit spolehat na to, ze budu tyto mezery vzdy rucne mazat, chci jeste nejakou fci, ktera je pripadne sama odstrani...
*Čvachta*
Profil *
Hm, tak to asi budes muset nacist jako textat a orezat. Jinak to nevidim.
jozob
Profil
Broli
Išlo by to riešiť asi takto:
* Načítaš súbor do premennej
* Odstrániš z neho prázdne znaky
* Pošleš obsah premennej na výstup

Ale pri poslednom bode by som sa trošku zastavil: ak sa v načítanom súbore vyskytujú skripty, potrebuješ, aby sa vykonali. Čiže v podstate potrebuješ nasimulovať priebeh funkcie include, ale s použitím obsahu uloženého v premennej. Na to použiješ funkciu eval, ktorá vykoná skript uložený v reťazci. Príklad:
<?php

$kod=file_get_contents(nazov_suboru); /* ulozi obsah suboru do premennej */
$kod=trim($kod); /* odstrani tzv. biele znaky (whitespaces) na zaciatku a konci retazca */
eval("?> ".$kod); /* vykona skripty v obsahu premennej */


Ešte dodám, že za posledným príkazom by nemal byť ukončovací znak ?>, pretože ukončuje sa v príkaze eval. Ďalej už pokračujeme rovnako ako v prípade uzatvoreného PHP kódu.
jozob
Profil
A dalo by sa to možno zapísať kratšie:
<?php eval("?> ".trim(file_get_contents(nazov_suboru)));
mila
Profil
Zkus ob_start(); To zařídí, že se výstup bude ukládat do zásobníku a nevypíše se. Pak je tam funkce, co to vyprázdí, tu si najdi, nevzpomínám si, ob_flush() to pošle prohlížeči.
*Čvachta*
Profil *
Není lepší ohlídat si ty mezery ručně?
jozob
Profil
mila
Ako to rieši situáciu? Riadený výstup nezabezpečí odstránenie "vajtspejsov", alebo snáď áno?
jozob
Profil
*Čvachta*
"Není lepší ohlídat si ty mezery ručně?"
Citujem Broliho: " ... Vzhledem k jejich poctu si nemohu dovolit spolehat na to, ze budu tyto mezery vzdy rucne mazat ... "
Broli
Profil
jozob
dik, pres eval to jde ...aspon to tak zatim vypada :)
jozob
Profil
Broli
Len si dávaj pozor na to ukončovanie, cháp to tak, že v evale sa to ukončí a za evalom už je normálny HTML výstup, pokiaľ znovu neotvoríš PHP, ale to Ti už asi nemusím hovoriť.
Broli
Profil
jenze podle toho, jak se to chova, to znova otvirat nemusim...

mam toto:

... php kod ...
eval(trim(file_get_contents($this->WebFolder.'webcreator/modules/sitem ap/sitemap.trans.php')));
... php kod ...


...a funguje to v pohode
mila
Profil
Ako to rieši situáciu? Riadený výstup nezabezpečí odstránenie "vajtspejsov", alebo snáď áno?
Pokud jsem tě pochopil, tak nechceš aby před hlavičkou bylo něco vypsáno. Pokud to pochytáš a pak vyčistíš, tak tam nic nebude.
Jelikož tam nesmí být vypsáno nic, tak tam asi ani nic nevypisuješ. Takže nevadí, že se zbavíš i neprázdných znaků.
jozob
Profil
mila
Tu nejde o problém s hlavičkami. Broli potrebuje odstrániť biele znaky pretože na stránku vkladá xml deklaráciu, ktorá ale musí byť na prvom riadku a nesmie byť pred ňou ani jeden znak.
llook
Profil
Já bych taky řekl, že je to podobné, jako problém s hlavičkami. Pokud ty skripty nemají mít vůbec žádný výstup, tak bych to taky vzal přes output-buffer, třeba takhle:
<?php
ob_start(); // zapne bufferování výstupu
require('config.php');
require('něco-jinýho.php');
ob_end_clean(); // ukončí bufferování a buffer zahodí
?>
<<?php ?>?xml version="1.0"?>
jozob
Profil
llook
Jasné, prečo ma to nenapadlo skôr.

mila
Sorry, Tvoj príspevok som čítal rýchlo a prehliadol som hlavnú myšlienku.

Broli
Riešenie, ktoré uviedoli llook a mila je lepšie, ako moje.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0