webForumDet fria alternativet

preg_match_all eller vad?

PHPur PHP

3 svar · 298 visningar · startad av fredriksk

fredrikskMedlem sedan maj 2001211 inlägg
#1

Jag håller på att bygga en template parser och har stött på problem.

Så här är det tänkt:
Jag har en html mall där jag har ett antal definierade "taggar" som jag vill senare byta ut mot relevant kod. Ett exempel på en sådan tagg är $MENU som sedan skall bytas ut mot en meny.

Tanken är att mallen skall "hackas upp" i delar sedan skall exempelvis menyn petas in på rätt ställe (där $MENU finns villsäga). Alltså om vi använder oss av den eminenta funktionen explode så borde förfarandet se ut så här för varje "tagg"

1. Kör explode på $MENU
2. echo första delen av explode (array[0])
3. echo meny kod
4. echo andra delen av explode (array[1])

Problemet jag brottas med nu är att jag måste få veta i vilken ordning alla taggarna dyker upp (jag kan ju inte göra en explode, peta in kod om man redan har kört en echo på den taggen.... struligt? jag vet, kom på ett bättre sätt om ni kan!).

Alltså: Jag vill ta reda på i vilken ordning taggarna dyker upp för att i tur och ordning köra explode och peta in motsvarande kod.

Jag har läst in template:n i en sträng som heter: $html_template
alla taggar finns i en array som heter: $taggs

resultatet skall lagras i en array som heter $ordered_taggs.

ok... hur löser jag detta nu.... för de som ens orkar förstå min poäng....

Hydr0maticMedlem sedan sep. 2001118 inlägg
#2

explode är onödigt. Kör preg_replace().

$html_template = preg_replace("/\$(\w+)/eU", "isset($taggs['\\1']) ? $taggs['\\1'] : '\\0'", $html_template);

.. förstod det som att $taggs['MENU'] innehåller det som $MENU ska ersättas med. Korrekt ?

fredrikskMedlem sedan maj 2001211 inlägg
#3

japp... du fattade aldeles korrekt.... men vad händer i de fall där $taggs['menu'] består av mer PHP kod som skall exikveras?

Så kommer fallet nämligen vara då bland annat en tagg heter CONTENT.

Hydr0maticMedlem sedan sep. 2001118 inlägg
#4

Hmm.. Är inget bra alternativ att erätta dem taggarna med kod som ska exekveras. Tror inte eval() kan hantera php-taggar "<? ?>", men inte säker. Det du bör göra istället är fånga outputten från den kod som avgör innehållet... Låt mig ta ett exempel..

I en av dina undersidor, t ex kontakt.php, har du följande struktur:

ob_start();

	require('menu.php');

$taggs['MENU'] = ob_get_clean();

ob_start();

	// All kod som producerar
	// innehållet på kontaktsidan

$taggs['CONTENT'] = ob_get_clean();

$html_template = file_get_contents('templatefile.html');
$html_template = preg_replace("/\$(\w+)/eU", "isset($taggs['\\\\1']) ? $taggs['\\\\1'] : '\\\\0'", $html_template);
echo $html_template;
124 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
122 ms — hämta tråd, inlägg och bilagor (db)