Autor | Zpráva | ||
---|---|---|---|
lopikol Profil |
#1 · Zasláno: 9. 3. 2011, 20:32:14
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 |
#2 · Zasláno: 9. 3. 2011, 20:33:59
|
||
Radek9 Profil |
#3 · Zasláno: 9. 3. 2011, 20:34:35
lopikol:
K tomu je funkce preg_replace s regulárními výrazy. |
||
lopikol Profil |
#4 · Zasláno: 9. 3. 2011, 20:38:46
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 |
#5 · Zasláno: 9. 3. 2011, 21:16:02
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 |
#6 · Zasláno: 9. 3. 2011, 21:30:37
|
||
lopikol Profil |
#7 · Zasláno: 10. 3. 2011, 14:40:20 · Upravil/a: lopikol
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 |
#8 · Zasláno: 10. 3. 2011, 19:21:16 · Upravil/a: Tori
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 |
#9 · Zasláno: 10. 3. 2011, 19:52:59 · Upravil/a: lopikol
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 |
#10 · Zasláno: 10. 3. 2011, 20:00:39
"V pořádku" = funguje?
|
||
lopikol Profil |
#11 · Zasláno: 10. 3. 2011, 20:11:53
tori právě že ne. To v pořádku se týkalo jen té uvozovky
|
||
Tori Profil |
#12 · Zasláno: 10. 3. 2011, 20:31:05
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 |
#13 · Zasláno: 10. 3. 2011, 21:18:58
Prostě ikdyž tam dám
$content = preg_replace("#({include )(.*)(})#e", "('<?php include $2; ?>')", $content); tak to v kodu najdu jako text. |
||
Tori Profil |
#14 · Zasláno: 10. 3. 2011, 21:40:45 · Upravil/a: Tori
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); (A opravdu by bylo lepší použít file_get_contents místo include.) |
||
Kcko Profil |
#15 · Zasláno: 10. 3. 2011, 21:44:43
Tori:
Nebude lepší preg_replace_callback |
||
lopikol Profil |
#16 · Zasláno: 10. 3. 2011, 21:49:33
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 |
#17 · Zasláno: 10. 3. 2011, 22:11:59
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 |
#18 · Zasláno: 10. 3. 2011, 22:31:41 · Upravil/a: Kcko
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 |
#19 · Zasláno: 10. 3. 2011, 22:38:20 · Upravil/a: Tori
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 |
#20 · Zasláno: 10. 3. 2011, 22:45:37
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 |
#21 · Zasláno: 11. 3. 2011, 14:38:16
[#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 |
#22 · Zasláno: 11. 3. 2011, 14:45:29
|
||
lopikol Profil |
#23 · Zasláno: 11. 3. 2011, 15:01:52
Kcko:
OK zkusim to nějak dohledat, ale zatim nic moc. |
||
Kcko Profil |
#24 · Zasláno: 11. 3. 2011, 15:06:41
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 |
#25 · Zasláno: 11. 3. 2011, 15:28:23 · Upravil/a: lopikol
[#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 |
#26 · Zasláno: 11. 3. 2011, 16:57:50
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 |
#27 · Zasláno: 11. 3. 2011, 17:26:25 · Upravil/a: Tori
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 !"; } |
||
lopikol Profil |
#28 · Zasláno: 11. 3. 2011, 17:31:18 · Upravil/a: lopikol
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 |
#29 · Zasláno: 13. 3. 2011, 07:58:20
Nějaké nápady k řešení too problému s array??
|
||
Tori Profil |
#30 · Zasláno: 13. 3. 2011, 10:44:18
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?? |
||
Téma pokračuje na další straně.
|
0