Hallo Rolf,
mein Codeschnipsel soll veranschaulichen, wie man mit preg_replace_callback alle Regex-Vorkommen in einem String verarbeitet. Dieser String ist eine komplette php Datei, die Du mit
readfilefile_get_contents bspw. eingelesen hast. Darauf könntest du dann meinen Codeschnipsel anwenden, ggf. sinnvoll für deine Belange angepasst, und dann haust Du die Quelldatei wieder raus.
Ok, jetzt hab ichs.
Für die Prüfung empfehle ich ein Tool, das ganze Verzeichnisbäume textuell vergleichen kann. Meins ist kdiff3 0.98 - allerdings seit 7 Jahren ungepflegt.
Ja, ich selber nutze das auch (ist glaub ich in mercurial eingebaut) beim Dateienvergleich, ansonsten nutze ich noch viel lieber csdiff, was aber auch ein Uralttool ist.
Also: die Zeile
my_function ( $hugo, int );
erzeugt einen Match (0) und drei Teilgruppen (1-3):0:
my_function ( $hugo, int )
(korrekt, kein Semikolon)
1:my_function ( $hugo,
2:int
3:)
Und genau diese vier Teile bekommt die Callback-Funktion als Array mit genau diesen Indizes übergeben. Sie konstruiert daraus dann das, was den gesamten Match ersetzen soll, und gibt es zurück.
Die wird von preg_replace_callback automatisch aufgerufen, für jeden Match, den sie findet. Der Name der Callback-Funktion wird preg_replace_callback als 2. Parameter mitgeben, als String. Es gibt auch andere Möglichkeiten dafür, das findet man unter "Callable" im PHP Handbuch.
Ok, die Regex hatte ich verstanden, aber ich hatte nicht verstanden, wo der Funktionsaufruf stattfand. Jetzt weiß ichs, es ist der Parameter.
Die Replacer-Funktion hat nur einen Zweck: sie soll deine Konstanten so umbauen, dass sie zu Konstanten nach PHP Muster werden, also ein gemeinsames Präfix für die Konstantengruppe und dann ein Schlüsselbegriff, und alles in Großbuchstaben.
Wenn Du das nicht willst, kannst Du das mit dem Callback auch lassen und einfach preg_replace mit einem Replace-Pattern wie "$1'%2'%3" verwenden, oder '$1"%2"%3' wenn es doppelte Anführungszeichen werden sollen. Dadurch wird die zweite Matchgruppe einfach in Hochkommas oder Anführungszeichen gesetzt.
Vielen dank für die erklärung. 👍 Ohne sie hätte ich zwar den Code gehabt, der hätte mir aber nicht so viel gebracht, weil ich gar nicht gewußt hätte, was er genau warum so macht.
Jörg