# Reguläre Ausdrücke - wie alles zwischen { und } aussuchen?



## ByeBye 8492 (25. April 2004)

Moinsen,

bin gerade dabei RegExps zu lernen, nun bin ich wohl an meine Grenzen gestoßen, denn ich krieg es nicht hin, das er mir  aus einem String mittelns
preg_match_all, alle Matches raussucht, wo ein Text ( irgendeiner) zwischen zwei geschweiften Klammen steht.

also zum Beispiel: {inhalt}  {bild02}, dies soll er dann aus dem String bzw. Template File auslesen und und ersetzen, mittels einer For schleife, aber ich kriege es nicht hin die { inhalt } auszufiltern *heul*.


----------



## stanleyB (25. April 2004)

```
<?php
$text = "Text der geparst werden soll";
preg_match_all("/({.*?})/", $text, $results);
for($i=0; $i<count($results[1]);$i++) {

  /* Ersetzen der Matches */

}
?>
```


----------



## Tim C. (25. April 2004)

Ich denke geschweifte Klammern müssen escaped werden.


----------



## stanleyB (25. April 2004)

Wegen den Quantifiern?
Denke nicht, zumindest hats der RegEx-Coach anstandslos ausgefuehrt.


----------



## Sven Petruschke (25. April 2004)

Das Escapen ist mir auch sofort in den Sinn gekommen. Habe es allerdings ausprobiert und es funktioniert tatsächlich.

snuu


----------



## JohannesR (26. April 2004)

Das Fragezeichen ist überflüssig, behaupte ich mal. * steht für Null oder mehr Elemente, da ist das optionalisieren nicht erforderlich.


----------



## ByeBye 8492 (26. April 2004)

Moinsen,
habe gestern Abend noch das hingekriegt:

preg_match_all("/{[a-zA-Z0-9]*}/", $to_parse, $parse_vars);

Das geht auch, werde mal das andere ausprobieren .

Wenn ich es richtig verstehe, werden bei den sachen wenn er im Text ein  {}

Die ist der zu parsender {text} . 

Dann nimmt er den gesamten eintrag also {}, oder? Wie kann man es hinkriegen, das er nur das nimmt was innendrinne steht, in dem Fall also "text"?


EDIT: Wieso hast du nacher in der Forschleife $result[1]? Ich habe da $result[0] und das geht auch, wo liegt da der unterschied?


----------



## stanleyB (26. April 2004)

```
<?php
$text = "Text der geparst werden soll";
preg_match_all("/({.*?})/", $text, $results);
for($i=0; $i<count($results[1]);$i++) {

  /* Ersetzen der Matches */

}
?>
```
Hier wir alles, einschliesslich der Klammern, geparst - wie du bereits gesagt hast.


```
<?php
$text = "Text der geparst werden soll";
preg_match_all("/{(.*?)}/", $text, $results);
for($i=0; $i<count($results[1]);$i++) {

  /* Ersetzen der Matches */

}
?>
```
Hier nur das, was von den Klammern umschlossen ist. Hol dir doch mal den RegEx Coach. Damit kannst du probieren, wie sich unterschiedliche Klassen, Quantifier, Modifiere auf deine Problemstellung auswirken. Ausserdem gibts hier auch ein nettes Tutorial von Tim Comanns zu RegExes.


----------



## ByeBye 8492 (26. April 2004)

stanleyB hat gesagt.:
			
		

> Ausserdem gibts hier auch ein nettes Tutorial von Tim Comanns zu RegExes.




Das Tutorial hab ich schon gemacht, damit kam ich dazu was ich bisher hatte, hat mir gut gefallen .

Öhm bei mir machen die beiden verschiedenen Sachen keinen Unterschied in meinem Script.

Beide liefern das Ergebnis inklusive Klammer ab.


----------



## stanleyB (26. April 2004)

Folgendes wird deine Fragen wohl verdeutlichen:

```
<?php 
$text = "Text der {geparst} werden {soll}"; 
preg_match_all("/{(.*?)}/", $text, $results); 

print "<pre>";
print_r($results);
print "</pre>";
?> 

/**
* Ausgabe:
* Array
* (
*     [0] => Array
*         (
*             [0] => {geparst}
*             [1] => {soll}
*         )
*
*     [1] => Array
*         (
*             [0] => geparst
*             [1] => soll
*         )
* 
* )
**/
```


----------

