---
title: "preg_replace och funktionsanrop"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/177953-preg-replace-och-funktionsanrop"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "learn"
published: "2009-04-09T19:13:30.000Z"
updated: "2009-04-18T11:25:19.000Z"
replies: 6
views: 676
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/177953-preg-replace-och-funktionsanrop"
---

# preg_replace och funktionsanrop

## #1 — learn, 2009-04-09T19:13Z

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

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

och en array:

```php
$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:

```php
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](http://www.webforum.nu/showthread.php?t=171660).

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

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

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

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

}
```

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

```php
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! :)

Permalänk: https://www.webforum.nu/p/177953

## #2 — learn, 2009-04-09T20:36Z

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!

Permalänk: https://www.webforum.nu/p/2181361

## #3 — aasah, 2009-04-09T22:47Z

**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:

```php
$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

Permalänk: https://www.webforum.nu/p/2181383

## #4 — learn, 2009-04-09T23:34Z

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](http://www.webforum.nu/showthread.php?t=171660)). Typ...

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

Permalänk: https://www.webforum.nu/p/2181392

## #5 — SPiN, 2009-04-10T05:48Z

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

Kanske något i stil med:

```php
$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... ;)

Permalänk: https://www.webforum.nu/p/2181400

## #6 — learn, 2009-04-11T19:16Z

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

Permalänk: https://www.webforum.nu/p/2181617

## #7 — learn, 2009-04-18T11:25Z

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

```php
// 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)

Permalänk: https://www.webforum.nu/p/2182282

---

Tråden på webben: https://www.webforum.nu/amne/php/177953-preg-replace-och-funktionsanrop
