Klammern werden nicht ersetzt. Mit Regextester aber schon?

timestamp

Mitglied Käsekuchen
Hi

ich stehe hier gerade vor einem Rätsel. Folgender Code soll Platzhalter in einem Template ersetzen. Die Platzhalter sind nach folgenden Muster aufgebaut:
{Platzhalter}
Der Code ersetzt allerdings nur was _in_ den Klammern steht, nicht die Klammern selbst. In einem online Regextester erhalte ich jedoch das gewünschte Ergebnis, nur auf dem Webserver nicht.
PHP:
$replace = array_slice(func_get_args(), 1);
preg_match_all('/\{[a-z0-9_.]+\}/i', $str, $matches);
return preg_replace($matches[0], $replace, $str);

$matches[0]:
Code:
array(3) {
  [0]=>
  string(8) "{errstr}"
  [1]=>
  string(7) "{errno}"
  [2]=>
  string(7) "{query}"
}

Template ($str):
Code:
<pre>
MySQL error:
{errstr} ({errno})
Query:
{query}
</pre>

Ausgabe:
Code:
MySQL error:
{Table '***.nothing' doesn't exist} ({1146})
Query:
{'SELECT something_that_doesnt_exist FROM nothing'}
 
Da ich leider nicht weis wie PHP mit RegEx umgeht , ich mich aber seit einiger Zeit damit in Java auseinander setze versuche es doch mal nach der Klassenbeschreibung von java.util.regex.Pattern die geschweiften Klammern zu escapen. Also anstatt einfach "{" mal "\\{" zu versuchen.
Hoffe das funktioniert.
 
Argh, der Fehler war so offensichtlich, dass es fast schon wieder peinlich ist. In der Abfrage mit preg_match_all verwenden diese in der Tat noch escapet. Da ich aber die genauen Strings die ich ersetzen muss kenne, habe ich preg_replace durch str_replace getauscht und damit war der Bug behoben. Ich vermute, dass escapen in preg_replace hätte genauso funktioniert, da ein regulärer Ausdruck an der Stelle allerdings überflüssig ist, bin ich wie gesagt auf str_replace umgestiegen.
Noch eine kleine Richtigstellung:
Escapet wird mit nur einem backslash :) "\{"
 
Hmm ... in PHP bestimmt ... aber ich bin ja von Java ausgegangen ... und da muss mann mit zwei Backslashes escapen da der Compiler sonst meckert das \{ keine gültige Escape-Sequenz ist.
Wie das nun in PHP ist weis ich nicht. Ich bin nur drauf gekommen weil die geschweiften Klammern doch eigentlich dazu verwendet werden eine Mengenangabe hinter einem Ausdruck anzugeben *zumindest in Java* ... und darum hab ich gedacht das man natürlich in diesem Zusammenhang die Klammern escapen muss um diese "Sonderstellung" zu deaktivieren.


btw : ERLEDIGT ? xD
 
Wonach sieht der denn verdächtig aus? Soweit ich weiß muss man Punkte nicht in eckigen Klammern escapen. Aber wie bereits geschildert, es funktioniert doch schon, der Fehler war dass ich in der zweiten preg_funktion die geschwungenen Klammern nicht escapet hatte.
 
Wenn man eine richtige RegEx-Engine nimmt MUSS man Punkte auch innerhalb von Klammern escapen da diese , ganz gleich ob innen oder nicht , IMMER die bedeutung "jedes Zeichen" haben *oder es zumindest sollten*.
 
Zurück