Autor | Zpráva | ||
---|---|---|---|
inc Profil * |
#1 · Zasláno: 2. 5. 2008, 20:17:35
Chtěl bych pomocí preg_replace nahrati nějaký text obsahem nějakého souboru, třeba moje.php, kde je i php kód, tudíž bych volil funkci include. Jak ale nahradit ten text includovaným souborem?
|
||
kletely Profil |
#2 · Zasláno: 2. 5. 2008, 20:23:20
inc
$subor = readfile("moje.php"); |
||
inc Profil * |
#3 · Zasláno: 2. 5. 2008, 20:39:01
Jenže já ještě nevím, že se soubor jmenuje moje.php. Provedu preg_replace, kde nahradím řetězec [data=moje.php] za include("moje.php"), ale tak, aby se to na dané místo opravdu includovalo, jenže nevím jak.
|
||
inc Profil * |
#4 · Zasláno: 2. 5. 2008, 20:43:08
Vlastně potřebuju místo přímého nahrazení spustit fci, který by text vytvořila.
|
||
bukaj Profil |
#5 · Zasláno: 2. 5. 2008, 22:59:01 · Upravil/a: bukaj
kletely
$subor = readfile("moje.php"); Nemyslím si, že readfile() opravdu vrací obsah souboru. inc kde nahradím řetězec [data=moje.php] za include("moje.php") Jestli to chápu správně, tak máš nějaký řetězec, kde se vyskytuje sekvence [data=moje.php] (či s nějakým jiným souborem) a ty potřebuješ nahradit výskyt této "značky" zpracovaným obsahem souboru. K tomu se dá využít fce preg_replace_callback(), která nad každým nalezeným řetězce zavolá specifikovanou fci a nahradí řetezec tím, co ta fce vrátí. <?php // funkce, která se použije jako callback, jediným parametrem je pole $data, // které obsahuje namapované údaje // v případě našeho reg. výrazu (níže) je soubor na indexu 1 function nahrad_vystupem_skriptu($data) { ob_start(); // zapnutí bufferování výstupu; myslím si, že klasická metoda, // jak v PHP získat zpracovaný obsah souboru include realpath($data[1]); // vložení souboru a vykonání skriptu $ret = ob_get_contents(); // získání výstupu ob_end_clean(); // vypnutí bufferování return $ret; // navrácení výstupu; tímto textem se nahradí nalezený výskyt } $upraveny_text = preg_replace_callback("@\\[data=(.*)\\]@", //regulární výraz "nahrad_vystup_textem", // tzv. callback; preg_replace_callback() nahradí // každý výskyt návratovou hodnotou této fce $vstupni_text); //původní text // v $upraveny_text je nyní řetězec [data=soubor.php] vždy nahrazen zpracovaným // výstupem daného souboru |
||
inc Profil * |
#6 · Zasláno: 3. 5. 2008, 00:25:52
Díky. A nedalo by se nějak přímo v preg_replace_callback, aby vracel hodnotu kterou chci a ne celý výpis řetězce? Takhle mi vrátí celé [data=moje.php] a já ve fci musím pomocí preg_replace vyrubat to moje.php.
|
||
bukaj Profil |
#7 · Zasláno: 3. 5. 2008, 13:54:05
inc
Tak teď nechápu, oč ti vlastně jde. Nechtěl bys to trochu více popsat? |
||
inc Profil * |
#8 · Zasláno: 4. 5. 2008, 12:42:29
No pokud preg_replace_callback najde [data=moje.php], tak spustí funkci, které předá řetězec [data=moje.php], já potřebuju, aby jí předal řetězec moje.php.
|
||
bukaj Profil |
#9 · Zasláno: 4. 5. 2008, 14:14:42
inc
pokud preg_replace_callback najde [data=moje.php], tak spustí funkci, které předá řetězec [data=moje.php] Ne, preg_replace_callback() předá dané fci pole, kde se na jednotlivých indexech nachází řetězce odpovádající obsahům závorek, na nultém pak řetězec, který odpovídá celému regulárnímu výrazu. Pokud vím, nastavení předání jiných argumentů nelze udělat. Ale lze jednoduše udělat wrapper pomocí tzv. anonymních lambda fcí, který zavolá tvou funkci: <?php $vystupni_text = preg_replace_callback( $regularni_vyraz, create_function( '$pole', 'return tvoje_funkce($pole[1]);' // místo indexu 1 můžeš použít jakýkoli jiný, // prostě index určuje s kolikátou závorkou // v regulárním výrazu bude tvoje_funkce() // pracovat ), $text); // takže např. pokud by byl tedy v $regularni_vyraz řetězec "@\\[data=(.*)\\]@" a v // $text by se nacházelo kupř. [data=moje.php], tento nález se nahradí návratovou hodnotou // tvoje_funkce("moje.php"); Taky je možné, že jsem nepochopil, co chceš. |
||
ijc Profil * |
#10 · Zasláno: 6. 5. 2008, 16:45:35
Tohle vrací pouze 1 znak.
|
||
bukaj Profil |
#11 · Zasláno: 6. 5. 2008, 18:32:56
ijc
Tohle vrací pouze 1 znak. To jsi toho řekl, opravdu vzevrubný popis tvého problému. Myslíš-li, že má smysl to řešit, musíš napsat víc. |
||
Časová prodleva: 16 let
|
0