PHP in Javascript übersetzen

Schon vor längerer Zeit hatte ich mir darüber Gedanken gemacht, wie man PHP-Klassen in Javascript-Objekte übersetzt. Jetzt habe ich einen kleinen Helfer bauen können, der einen Großteil der Arbeit automatisiert.

Wie man am Beispiel eines kleinen Vigenère-Listings sieht, sind die Strukturen von PHP-Klassen und Javascript-Objekten eigentlich sehr gleichartig. Mit der folgenden Javascript kann man einen Großteil der Transformation durchführen, und muss danach nur noch einige Details anpassen.

/**
 * Afterwards you will need to:
 * - add `var` in front of uninitialized variables
 * - move default values for function parameters into function body like `param = param || 'default';`
 * - add `,` after every object property (variables & methods)
 * - replace PHP functions
 * @param  {String} php [description]
 * @return {String}     [description]
 */
var transformPhpToJs = function(php) {
  return php
    .replace(/<\?php\s*/g, '')
    .replace(/\?>\s*/g, '')
    .replace(/(protected|public|private|const) (\S+)\s?=/g, '$2 :')
    .replace(/(protected|public|private|const) /g, '')
    .replace(/(function) (\S+)\s?/g, '$2: $1')
    .replace(/(class) (\S+)\s?/g, 'var $2 = ')
    .replace(/\$/g, '')
    .replace(/SELF::/g, 'this.')
    .replace(/->/g, '.')
    .replace(/array\(([\s\S]*?)\);/g, '[$1];')
    .replace(/=>/g, ':')
    .replace(/empty\((.+?)\)/g, '!$1')
    .replace(/preg_replace\(['"](.+?)['"],(.+?),\s?(.+?)\s?\)/g, '$3.replace(/$1/g,$2)')
    .replace(/preg_match\(['"](.+?)['"],\s?(.+?)\s?\)/g, '$2.match(/$1/)')
  ;
}

Diese Funktion könnt ihr z.B. in die F12-Konsole von eurem Browser eingeben, und danach euren PHP-Quelltext im Browser übersetzen lassen. Folgender Aufruf gibt euch das transformierte PHP zurück:

transformPhpToJs(`INSERT YOUR PHP HERE`);

Geht dafür wie folgt vor:

  1. Öffnet in Google Chrome oder Mozilla Firefox mit F12 eure Entwicklerkonsole.
  2. Wechselt auf den Tab „Konsole“.
  3. Kopiert o.a. Funktion in die Konsole und drückt Enter.
  4. Jetzt könnt ihr mit dem o.a. Aufruf euren dort eingefügten PHP-Code in Javascript übersetzen lassen.
  5. Die Ausgabe könnt ihr nun kopieren und in eine Datei einfügen, um danach die letzten Anpassungen vorzunehmen.

Natürlich muss das Ergebnis noch nachbearbeitet werden, aber für die meisten Fälle erledigt es zumindest die groben Arbeiten. Danach könnt ihr z.B. daran gehen die richtige NodeJS-Modul-Struktur einzubauen.

Update: Mathias hat mich auf Locutus aufmerksam gemacht:

Locutus is a project that seeks to assimilate other languages’ standard libraries to JavaScript.

Hier findet ihr viele PHP-Funktionen als Javascript-Module umgesetzt. Die ganze Bibliothek ist zwar mit Augenzwinkern zu verstehen, für schnelle Erfolgserlebnisse eignet sie sich aber alle Mal.