Autor Zpráva
stream
Profil *
takže o co jde. potřebuji aby v templatu (načtený ve stringu do proměný $TEMPLATE) se nahradily všechny výskity %nazev% za obsah proměný (pole) s indexem nazev... takže $pole[nazev]

myslel jsem že to pujde takhle
$TEMPLATE = preg_replace("/\%(.*)\%/",$RS_lang['$1'],$TEMPLATE);

ale bohužel nejde :\ budu moc vděčný za všechny rady
lordfrikk
Profil
Zkus namísto "/\%(.*)\%/" použít "/\%(.*)\%/U".
stream
Profil *
mno i s tímhle problém přetrvává... problém není ani tolik v regulérním výrazu jako v zápisu indexu pole... do $1 dostanu to co potřebuji tedy nazev. jenže když dosadím '$0' do indexu tak se to chová jako string "$0" nikoliv jako nazev :\
lordfrikk
Profil
Odstraň uvozovky kolem $0. Jednoduché uvozovky způsobují, že řetězec je vyhodnocen doslovně a ne interpretován jako proměnná.
stream
Profil *
to pak vyhodí tuhle hlášku:
Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in ... on line 35
bukaj
Profil
stream
$TEMPLATE = preg_replace("/\%(.*)\%/",$RS_lang['$1'],$TEMPLATE);
Jen těžko to půjde takhle. PHP je jazyk s eager evaluation (radši nepřekládám do češtiny), kdy se nejdříve všechny parametry fce vyhodnotí a pak se předá jejich hodnota. Takže první parametr je řetězec ("/\%(.*)\%/"), nepotřebuje se již dál vyhodnocovat. Ale druhý je proměnná ($RS_lang['$1']), tudíž se PHP pokusí najít ve své tabulce proměnných tu označenbou jako RS_lang, a když ji najde a zjistí, že je to pole, pokusí se najít její index '$1', který s největší pravděpodobnostá neexistuje, takže jako druhý parametr se do fce preg_replace() předá NULL. Třetí parametr -- zase proměnná ($TEMPLATE) -- zase se pokusí najít jejíc hodnotu.

Takže toto volání je nejspíš jako volat preg_replace("/\%(.*)\%/", NULL, "...string s templatem...");

Jestli se snažíš o to, co myslím -- výskyt %promenna% nahradit hodnotou z $RS_lang['promenna'] -- tak to takhle nepůjde. Nejjednodušší podle mě je si k tomu vyrobit objekt, ve kterém se bude volat preg_replace_callback() na instanční fci. Lepší bude příklad:
<?php
class Replacer
{
    private $RS_lang;
    private $TEMPLATE;

    public function __construct(array $RS_lang, $TEMPLATE)
    {
        $this->RS_lang = $RS_lang;
        $this->TEMPLATE = $TEMPLATE;
        $this->TEMPLATE = preg_replace_callback(
            "/\%(.*)\%/", 
            array($this, 'callback_func'), // callback na instanční fci callback_func
            $this->TEMPLATE
        );
    }

    private function callback_func($matches)
    {
        return $this->RS_lang[$matches[1]];
    }

    public function __toString()
    {
        return $this->TEMPLATE;
    }

}

$i = new Replacer(array('hello_world' => 'Ahoj světe!'), '<h1>%hello_world%</h1>');
echo $i; // vypíše "<h1>Ahoj světe!</h1>"
stream
Profil *
zatim OOP v php moc nerozumim ale to se časem vyřeší aspon mám co zkoumat XD moc díky :-))

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:

0