Hallo Jörg,
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 readfile file_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.
TESTE DAS AUF EINER KOPIE DEINER SOURCEN
MACH EIN BACKUP VON DEINEM SOURCE, BEVOR DU DEN ERSTEN ECHTEN LAUF MACHST!
PRÜFE DAS ERGEBNIS SEHR GENAU, BEVOR DU ES AKZEPTIERST
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. Für neuere Versionen finde ich keinen Windows Build, brauchte ich bisher auch nicht. Es gibt sicherlich auch andere Tools für diesen Zweck.
Die Regex matcht deine Funktionsaufrufe, und wie es bei Regexen so ist, gibt es nicht nur den eigentlichen Match "von vorn bis hinten", sondern auch eine Match Group für jeden Klammerausdruck.
Die Regex ist
/\b(my_function\b\s*\(.*?,\s*)
(int|string|float|int_null|int_allow_negative|bool)
(\s*\))/m
Ich habe bewusst an den Klammern die Zeilenumbrüche gemacht. Die Regex-Mustersymbole erkläre ich jetzt nicht, den Roman dazu findest Du hier.
Die erste Klammergruppe matcht my_function(...,
also alles von my_function bis zum Komma, das 1. und 2. Parameter trennt. Vor der Klammer und hinter dem Komma darf noch beliebig Leerraum stehen. Die Regex funktioniert nicht, wenn dein 1. Parameter ein komplizierterer Ausdruck ist, der selbst Kommas enthält (z.B. ein Funktionsaufruf). Eine Regex kann kein vollständiger Codeparser sein. Wenn Du das benötigst, brauchst Du sowas wie das hier. Careful, there be dragons inside...
Die zweite Klammergruppe ist eine Auflistung von möglichen Konstanten, von int bis bool. Sie matcht exakt die Schreibweise, weil bei den Optionen kein i
dabei ist - ich hoffe, das passt für Dich.
Die dritte Klappergruppe ist dann wieder Leerraum und eine rechte Klammer.
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.
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.
Rolf
sumpsi - posui - obstruxi