« 1 2 »
Autor Zpráva
lopikol
Profil
Když soubor obsahuje {$include #pokus.htm} chtěl bych to nahradit php kodem.
Napadlo mne použít str_replace, ale tam už by někdo muselo být někde definováno (array('{$include #pokus.htm}' => '<?php include pokus.htm; ?>' ))

Kéž by to šlo nějak takhle:
str_replace('{$include #'.$kod.'}', '<?php include $kod; ?>', $content);
Tori
Profil
preg_replace
Radek9
Profil
lopikol:
K tomu je funkce preg_replace s regulárními výrazy.
lopikol
Profil
Nemohli by ste mi prosím upravit ten můj příklad? Nějak to nemohu dát dohromady, resp nevim jak to zapsat.
lopikol
Profil
tak už to mám, ale je problém v tom, že ten přepis kde je kod php se vypíše do html > neprovede se.
Tori
Profil
lopikol:
kod php se vypíše do html > neprovede se.
Koukněte na modifikátor 'e' v reguláru.
lopikol
Profil
Mám toto.
$content = preg_replace("#({include )(.*)(})#e", "('<?php include "./" . "$2" . "; ?>"')", $content);



Výsledkem je, že v html kodu je napsáno:
<?php include ./@default.phtml; ?>
Tori
Profil
lopikol:
Tak jsem to vyzkoušela - include dá vloženou šablonu na začátek výstupu, ale s file_get_contents už je všechno na správném místě.

Váš regulár funguje, chyba je v nahrazení - nevyhodilo vám syntaktickou chybu o "neočekávané tečce" či lomítku? Uvozovky je potřeba escapovat a ta před středníkem je navíc. <?php + ?> bych taky dala pryč (nelze použít uvnitř skriptu a i tady vyhodí chybu).

edit: To, že se příkaz vypíše, místo aby se provedl, způsobují ty apostrofy okolo include - pokud se mají zobrazit, tak je dejte do některé šablony.
lopikol
Profil
Tori:
chybu o "neočekávané tečce" či lomítku?
Nn žádná chyba.

ta před středníkem je navíc
Nn určitě není navíc. Však si to zkuste a uvidíte, že je tam správně.

EDIT: naopak jeno mi tam chybělo -> upraveno. Ale u sebe to mám v pořádku.
Tori
Profil
"V pořádku" = funguje?
lopikol
Profil
tori právě že ne. To v pořádku se týkalo jen té uvozovky
Tori
Profil
lopikol:
Však si to zkuste a uvidíte, že je tam správně
No, proto vám to právě píšu, že jsem zkoušela co ještě funguje a co už vyhodí chybu (ne všechno byly Fatal Error, možná máme odlišně nastavené error_reporting ).
lopikol
Profil
Prostě ikdyž tam dám
$content = preg_replace("#({include )(.*)(})#e", "('<?php include $2; ?>')", $content);


tak to v kodu najdu jako text.
Tori
Profil
lopikol:
tak to v kodu najdu jako text.
Ano, jak jsem psala v [#8], způsobují to ty apostrofy.
$content = preg_replace("#({include )(.*)(})#e", "('<?php include $2; ?>')", $content);
Ty způsobují, že se to celé (po dosazení nalezeného názvu souboru) vyhodnotí jako řetězec. Když je vyhodíte, bude se to vyhodnocovat jako PHP kód - a pak teprve vám hodí chybu to <?php. Okolo názvu includovaného souboru uvozovky/apostrofy naopak nechte, tam jsou správně.
(A opravdu by bylo lepší použít file_get_contents místo include.)
Kcko
Profil
Tori:
Nebude lepší
preg_replace_callback
aka funkce přímo stvořená k tomuto účelu?
lopikol
Profil
Tori:
Tak jak to teda mám udělat, když mám někde definovanou cestu k souboru a chci to zde mít. Na to se používání uvozovky a spojuje se to tečkami.
'include " . DIR . "/pokus/" . "$2" . ";'
Tori
Profil
Kcko:
Hm... máte pravdu, děkuji za opravu.

lopikol:
S inspirací od Kcka:
$content = preg_replace_callback('#({include )(.*)(})#', 
  create_function('$matches', 'return file_get_contents(DIR."/pokus/".$matches[2]);'), $content);
Kcko
Profil
Tori:

nebo možná o malinko čitelněji čitelněji :-)

$content = preg_replace_callback('#({include )(.*)(})#', 
  function($matches) { return file_get_contents(DIR."/pokus/".$matches[2]);}, $content);
Tori
Profil
Kcko:
Mě to samozřejmě taky připadá čitelnější, ale do verze PHP 5.3.0 si můžu místo výsledku přečíst chybovou hlášku.

edit: Tohle ↓ bude asi lepší, dá se tam přidat kontrola existence souboru apod. a použít to i jinde.
Kcko
Profil
Tori:
Aha, toho jsem si nevšiml, holt nepracuji na serveru se zastaralou verzí :-)

Tak v tom případě takto.


$content = preg_replace_callback('#({include )(.*)(})#',  "foo", $content);

function foo($matches)
{
  return ..
}


Váš kód rozhodně špatný není, nicméně to create_function mě tam děsí ;)
lopikol
Profil
[#20] Kcko Díky dobrej nápad oddělit to do funkce :) Líp se mi aspon bude řešit i jiné nahrazování, ale ten příklad končí chybou:
Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, 'foo', to be a valid callback in ****.php on line 24

což je řádek, kde je:
$content = preg_replace_callback('#({include )(.*)(})#',  "foo", $content);
Kcko
Profil
lopikol:
Určité znaky musíš escapovat. např. } a to takto \}
Jaké další si dohledej
lopikol
Profil
Kcko:
OK zkusim to nějak dohledat, ale zatim nic moc.
Kcko
Profil
lopikol:
Co přesně potřebuješ? Ta konstrukce je mimojiné šílená, mám tech chvíli čas, tak ti to napíšu jinak to bude zas na půl dne.
lopikol
Profil
[#24] Kcko Díky moc. O téhle funkci jsem slyšel poprvé a jsem z ní docela zmatenej ;)

Potřebuji {include pokus.html} nahradit tak, aby se do šablony přidal jeho obsah. To vše mi umožní kod, který si sem dal:
$content = preg_replace_callback('#({include )(.*)(})#',  "foo", $content);

function foo($matches)
{
  return ..
}


Problém je v tom, že to končí tou chybou a nevím jak se jí zbavit:
Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, 'foo', to be a valid callback in ****.php on line 24

$content = preg_replace_callback('#({include )(.*)(})#',  "foo", $content);


Tak jestli by si mohl říct, resp escapovat ty {} Díky.

EDIT: Zkusil jsem nahradit { } za \{ \}, ale stále to končí stejnou chybou.

EDIT2: Vůbec není třeba escapovat. Dalčí prolém byl v tom, že v tom příkladu chyběly #.
lopikol
Profil
Chtěl jsem se ještě zeptat.
Funkci:
function foo($matches)
{
  return ..
}


jsem si upravil na

function foo($matches)
{
$content = array(
        '{include' . $matches[2] . '}'			=> file_get_contents(DIR."/pokus/".$matches[2]);),
      
      );
return $content
}


Ale končí to chybou:
Notice: Array to string conversion in a templatu se mi vypíše slovo Array.
Jak to upravit? Omouvám se, ale asi si sedim na vedení a nějak mi nedochází souvislosti :/
Tori
Profil
lopikol:
preg_replace[_callback] nahrazuje něco za něco jiného: v prvním parametru se určí, co se má najít, a ve druhém čím se to má nahradit. Tzn. když hledáte uvnitř řetězce, tak funkce foo musí rovněž vrátit řetězec:
function foo($matches)  {
  if (is_file(DIR."/pokus/".$matches[2]))
    return file_get_contents(DIR."/pokus/".$matches[2]);
  else
    return "Požadovaný soubor {$matches[2]} neexistuje !";
}
Jestli nechcete kontrolovat existenci souboru, který by se měl includovat, ponechte uvnitř funkce jen řádek č.3.
lopikol
Profil
Tori: JJ to jemi jasné, ale když tomám takhle hezky ve funkci, tak chci udělat i jiné nahrazování např {pokus auto} VIZ:

lopikol:#26
lopikol
Profil
Nějaké nápady k řešení too problému s array??
Tori
Profil
lopikol:
Ta řešení v #17 nebo #18 nebo (#20 + #27) nefungují?

Ad „Array to string conversion“: Co je na tom? Preg_replace zavolá funkci foo, a chce od ní řetězec. Jenže ona mu pošle pole (které se zkonvertuje na řetězec "Array"). Souvisí to s tímto? 

chci udělat i jiné nahrazování např {pokus auto}
Co přesně by to mělo dělat??
« 1 2 »

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: