webForumDet fria alternativet

preg_replace och funktionsanrop

6 svar · 670 visningar · startad av learn

learnMedlem sedan jan. 20051 130 inlägg
#1

Jag har en sträng som kan se ut enligt följande:

$str = "Jag heter {namn} och jag gillar {hobby}";

och en array:

$data= array("namn" => "anders andersson", "hobby" => "fotboll");

Jag byter sedan ut allt som står innanför { och } till lämpligt innehåll så här:

preg_replace('/\{([a-z0-9\-_]*?)\}/ise', 'isset($data[\'\1\']) ? $data[\'\1\'] : \'\'', $string);

Resultat:

Jag heter anders andersson och jag gillar fotboll

Klockrent tack vare Hulken.

Nu vill jag kunna lägga in funktioner också. Strängen kan då se ut så här:

$str = "Jag heter formateString({namn}) och jag gillar {hobby}";

och här anropas alltså en funktion med namnet "formateString" (exempel):

function formateString($str) {
 
 $new_str = ucwords($str);
 echo "<b>".$new_str."</b>"; 

}

Så här långt har jag kommit med min preg_replace:

preg_replace('/([a-zA-Z0-9\-\_]*)[\(](.*)[\)]/', 'call_user_func(\'\1\', \'\2\')', $str);

Men då blir utskriften:

Jag heter call_user_func('formateString', 'robert') och jag gillar fotboll

Jag vill ju såklart ha det så här:

Jag heter <b>Anders Andersson</b> och jag gillar fotboll

Jag tror jag är någorlunda på rätt väg... Hur ska jag få till det här??

Tack! :)

learnMedlem sedan jan. 20051 130 inlägg
#2

Någon som har något förslag? Känns som sagt att jag är på hyfsat rätt väg. Snälla hjälp mig in i mål!

aasahMedlem sedan mars 20034 471 inlägg
#3

Varför vill du skriva in funktioner och utbytesord i en sträng? Ett mer normalt och betydligt enklare sätt att hantera ett skriptspråk är att använda strängar för just text och låta skriptspråket ta hand om allt annat. Följande löser beskrivet problem mycket enklare:

$data= array("namn" => "anders andersson", "hobby" => "fotboll");

function makeBold($str) {
  return '<b>'.$str.'</b>';
}
  
$str = "Jag heter {$data["namn"]} och jag gillar {$data["hobby"]}";
echo $str;
//Eller
$str2 = "Jag heter ".$data["namn"]." och jag gillar ".$data["hobby"];
echo $str2;
$str3 = "Jag heter ".makeBold($data["namn"])." och jag gillar ".$data["hobby"];
echo $str3;

koden ovan om vi tänker oss radbrytningar emellan skrev:

Jag heter anders andersson och jag gillar fotboll
Jag heter anders andersson och jag gillar fotboll
Jag heter anders andersson och jag gillar fotboll

learnMedlem sedan jan. 20051 130 inlägg
#4

Njae, så funkar det inte i mitt fall. Grejen är man ska kunna skriva in strängen i ett formulär:

Jag heter formateString({namn}) och jag gillar {hobby}

och sedan klicka på submit för att generera:

Jag heter <b>Anders Andersson</b> och jag gillar fotboll

Lite som Wordpress (som The Hulk skrev). Typ...

Så hur kan man göra? Det borde ju gå, precis som det går bra med variablerna...

SPiNMedlem sedan mars 20007 896 inlägg
#5

Det finns en funktion som heter preg_replace_callback() som antagligen gör vad du är ute efter, och tillsammans med create_function() (som skapar anonyma funktioner) kan du antagligen få önskat resultat.

Kanske något i stil med:

$str = preg_replace_callback(
                           DITT_MÖNSTER, 
                           create_function(
                                 'return call_user_func($matches[1], $matches[2]);'
                           ), 
                           $str
      );

Helt otestat, och jag har inte stenkoll på hur det fungerar - du får labba dig fram! Det är fortfarande alldeles för tidigt för att jag ska ha koll... ;)

learnMedlem sedan jan. 20051 130 inlägg
#6

Ok, tack för tipset! Ska genast kika på det.

learnMedlem sedan jan. 20051 130 inlägg
#7

Nu har jag knåpat ihop en schysst preg_replace_callback som fungerar precis som jag önskat i inläggen ovan.

// Pattern for PHP function: function_name($parameter1,$parameter2...)
$pattern = "/([a-zA-Z0-9\-\_]*)\((.*?)\)/";
				
// Search for and create PHP functions
$str = preg_replace_callback
(
	$pattern,
	create_function
	(
		'$matches',
		'$func = $matches[1];
		$params = explode(",", $matches[2]);
		return call_user_func_array($func, $params);'
	), 
	$str
);

Observera att jag använder call_user_func_array istället för call_user_func, på så sätt kan man skicka med så många parametrar man önskar.

Feel free to use :)

(Kom gärna med förslag på förbättringar)

128 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)