Autor Zpráva
inc
Profil *
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
inc
$subor = readfile("moje.php");
inc
Profil *
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 *
Vlastně potřebuju místo přímého nahrazení spustit fci, který by text vytvořila.
bukaj
Profil
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 *
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
inc
Tak teď nechápu, oč ti vlastně jde. Nechtěl bys to trochu více popsat?
inc
Profil *
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
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 *
Tohle vrací pouze 1 znak.
bukaj
Profil
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: