osiris: Array aus Javascript nach Php

Hallo.

Ich muss bei einem Projekt eine externe Javascript-Bibliothek(markitup) einbinden. Diese enthält (je nachdem, was der User für Pakete dieser Bibliothek installiert hat) verschiedene Javascript-Konfigurationsdateien, die immer gleich aufgebaut sind:

  
var mySettings = {  
	onShiftEnter:  	{keepDefault:false, replaceWith:'<br />\n'},  
	onCtrlEnter:  	{keepDefault:false, openWith:'\n<p>', closeWith:'</p>'},  
	onTab:    		{keepDefault:false, replaceWith:'    '},  
	markupSet:  [ 	  
		{name:'Bold', key:'B', openWith:'(!(<strong>|!|<b>)!)', closeWith:'(!(</strong>|!|</b>)!)' },  
		{name:'Italic', key:'I', openWith:'(!(<em>|!|<i>)!)', closeWith:'(!(</em>|!|</i>)!)'  },  
		{name:'Stroke through', key:'S', openWith:'<del>', closeWith:'</del>' },  
		{separator:'---------------' },  
		{name:'Bulleted List', openWith:'    <li>', closeWith:'</li>', multiline:true, openBlockWith:'<ul>\n', closeBlockWith:'\n</ul>'},  
		{name:'Numeric List', openWith:'    <li>', closeWith:'</li>', multiline:true, openBlockWith:'<ol>\n', closeBlockWith:'\n</ol>'},  
		{separator:'---------------' },  
		{name:'Picture', key:'P', replaceWith:'<img src="[![Source:!:http://]!]" alt="[![Alternative text]!]" />' },  
		{name:'Link', key:'L', openWith:'<a href="[![Link:!:http://]!]"(!( title="[![Title]!]")!)>', closeWith:'</a>', placeHolder:'Your text to link...' },  
		{separator:'---------------' },  
		{name:'Clean', className:'clean', replaceWith:function(markitup) { return markitup.selection.replace(/<(.*?)>/g, "") } },		  
		{name:'Preview', className:'preview',  call:'preview'}  
	]  
}  

Das ist leider kein JSON und daran kann ich auch nichts ändern. Nun will ich aber die eizelnen Optionen unter einer Konfigurationsoberfläche in php zur Verfügung stellen und will dieses Objekt in Php umwandeln.

Dazu will ich nicht erst die js-Datei lokal ausführen, das Objekt jsonifizieren und dann per POST an den Server schicken, sondern Php sollte den Inhalt der JS-Datei als String einlesen und dann loszaubern.

Hat jemand eine Idee, wie das elegant zu lösen ist, außer mit vielen Schleifen und regexen über den String zu laufen?

mfg,
Marc

  1. hi,

    Hat jemand eine Idee, wie das elegant zu lösen ist,

    Ne, nur unelegant: Die JS-Functionen erweitern, so dass Cookies gesetzt werden und ein reload erfolgt. Beim nächsten Request gehen dann die Cookies zum Server und PHP kann die auslesen.

    Hotti

    1. Danke, aber so kann ich das auf keinen Fall machen.

      Wenn ich erst den Umweg über den Client gehen muss, dann kann ich nicht mehr sicher sein, was wirklich zurückkommt. Der Client könnte die Inhalte auch verändert zurücksenden, außerdem hätte ich das Ganze gerne mit einem Seitenaufruf erledigt.

      Ich muss also zwingend die JS-Datei serverseitig auslesen.

      mfg,
      Marc

      1. Hi,

        Ich muss also zwingend die JS-Datei serverseitig auslesen.

        Vielleicht gibt das ein paar Ansatzpunkte: http://stackoverflow.com/questions/1554100/parsing-javascript-not-json-in-php

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. hi,

    Hallo.

    Ich muss bei einem Projekt eine externe Javascript-Bibliothek(markitup) einbinden. Diese enthält (je nachdem, was der User für Pakete dieser Bibliothek installiert hat) verschiedene Javascript-Konfigurationsdateien, die immer gleich aufgebaut sind:

    var mySettings = {
    onShiftEnter:   {keepDefault:false, replaceWith:'<br />\n'},
    onCtrlEnter:   {keepDefault:false, openWith:'\n<p>', closeWith:'</p>'},
    onTab:     {keepDefault:false, replaceWith:'    '},
    markupSet:  [
    {name:'Bold', key:'B', openWith:'(!(<strong>|!|<b>)!)', closeWith:'(!(</strong>|!|</b>)!)' },
    {name:'Italic', key:'I', openWith:'(!(<em>|!|<i>)!)', closeWith:'(!(</em>|!|</i>)!)'  },
    {name:'Stroke through', key:'S', openWith:'<del>', closeWith:'</del>' },
    {separator:'---------------' },
    {name:'Bulleted List', openWith:'    <li>', closeWith:'</li>', multiline:true, openBlockWith:'<ul>\n', closeBlockWith:'\n</ul>'},
    {name:'Numeric List', openWith:'    <li>', closeWith:'</li>', multiline:true, openBlockWith:'<ol>\n', closeBlockWith:'\n</ol>'},
    {separator:'---------------' },
    {name:'Picture', key:'P', replaceWith:'<img src="[![Source:!:http://]!]" alt="[![Alternative text]!]" />' },
    {name:'Link', key:'L', openWith:'<a href="[![Link:!:http://]!]"(!( title="[![Title]!]")!)>', closeWith:'</a>', placeHolder:'Your text to link...' },
    {separator:'---------------' },
    {name:'Clean', className:'clean', replaceWith:function(markitup) { return markitup.selection.replace(/<(.*?)>/g, "") } },
    {name:'Preview', className:'preview',  call:'preview'}
    ]
    }

    
    >   
    > Das ist leider kein JSON  
      
    Ist es nicht? <http://www.json.org/>  
      
    mfg  
      
    tami
    
    1. [latex]Mae  govannen![/latex]

      Das ist leider kein JSON

      Ist es nicht? http://www.json.org/

      Nein, ist es nicht. Das ist Javascript-(Objekt-)Literal-Schreibweise. JSON ist eine definierte Teilmenge davon, mit Regeln, die für die Literal-Schreibweise nicht gelten (müssen).

      (so, damit habe ich mein Tageskontingent an „Bindestrichen“ verbraten)

      Stur lächeln und winken, Männer!
      Kai

      --
      It all began when I went on a tour, hoping to find some furniture
       Followed a sign saying "Beautiful Chest", led to a lady who showed me her best)
      SelfHTML-Forum-Stylesheet
  3. Servus,
    ich kennen deinen Anwenungsfall nicht genau, aber wäre es nicht viel sinniger den umgekehrten Weg zu gehen und die Javascript-Konfigurations-Dateien von einem PHP-Skript erzeugen zu lassen?

    Grüße
    -1UP

    1. Schön wärs.

      Und letztendlich will ich genau das machen. Leider müssen die Anwender die Bibliothek selbst installieren, also in ein Verzeichnis ihrer Wahl kopieren.

      Mein Script nach den Konfigurationsdateien, erstellt einmalig ein Kopie davon, lagert die zur weiteren Verwendung in der Datenbank ein und verwendet sie, um eine Konfiguration für den Editor zu generieren.

      Du siehst, ich muss sowieso beide Wege gehen.

      Marc

      1. Mein Script nach den Konfigurationsdateien, erstellt einmalig ein Kopie davon, lagert die zur weiteren Verwendung in der Datenbank ein und verwendet sie, um eine Konfiguration für den Editor zu generieren.

        Den Teil hab ich nicht ganz verstanden. Geh ich richtig davon aus, dass du bisher statische Konfigurationsdateien hast? Warum nicht dynamisch?

        1. Zur Veranschaulichung:
          Statisch: Die Konfigurations-Datei wird einmalig erzeugt und dann auf dem Server abgelegt.

          Dynamisch: Bei jedem Zugriff auf die Konfigurationsdatei wird diese von einem PHP-Skript neu erzeugt und direkt an den Client gesendet. So wie du auch HTML-Dateien mit PHP erzeugst und sie übermittelst.

          1. Ja, soweit schon verstanden.

            Wie gesagt, ich muss erst einmal wissen, was es zu konfigurieren gibt. Dazu muss ich die vom Anbieter der externen Bibliothek bereitgestellte Konfiguration einlesen.

            Erst dann kann ich dynamisch eine eigene aus diesem Template erzeugen. Und die externe Konfig ist für mich nicht veränderbar (also an sich schon, aber ich will sie wegen upgradefähigkeit und so nicht verändern müssen!).

            Mfg,
            Marc

            1. Tach!

              Und die externe Konfig ist für mich nicht veränderbar (also an sich schon, aber ich will sie wegen upgradefähigkeit und so nicht verändern müssen!)

              Dein Problem ist dann aber schon, dass der Anbieter der externen Bibliothek bei einem Update oder Upgrade immerhin auch die Art der Konfiguration komplett ändern könnte - oder auch nur so geringfügig, dass dieses zu nicht sofort auffälligen Fehlern führt . Eine unbeobachtete, automatische Installation von anderen als bekannten und frei gegebenen Versionen kommt also ohnehin nicht in Frage. Dann kann man, bei der ohnehin fälligen und ohnehin aufwendigen manuellen Prüfung aber auch das Template ggf. mit anpassen.

              Unter diesem Aspekt sieht es für mich so aus, als wäre ein automatisiertes "parsen" des Javascriptes eine teure Sache, weiß doch niemand im voraus, wie oft das extra dafür entwickelte Skript ausgeführt wird.

              Also ich würde ebenfalls dazu neigen, die originale JS-Datei durch ein mit PHP bearbeitetes Template zu ersetzen.

              Fred

              1. Wenn du die Möglichkeit hast, installierst du dir wohl am besten  Node.js auf dem Server. Dann kannst du Javascript auch auf deinem Server parsen.

                1. Danke für den Hinweis, aber ich hab leider keine Rechte dazu.

                  Letztendlich mache ich es so: Ich erstelle manuell ein Formular mit allen Optionen, die die Bibliothek bietet (umständlich, muss von Zeit zu Zeit angepasst werden).

                  Fred hatte mit dem Argument natürlich vollkommen Recht, dass sich die Konfiguration in ihrer Syntax ändern könnte. Da brauch ich mir schon nicht länger den Kopf zerbrechen, sondern erst wenn's soweit ist und eine neue Version her muss.

                  Danke an alle Antwortenden.

  4. Hallo,

    Ich weiß nicht ob es hilft aber du könntest erst mal per str_replace() dieses "var mySettings = " wegmachen und dann Pears Services_JSON benutzen, das gut mit keys die nicht in Anführungszeichen sind umgehen kann.

    <?php  
      
    $js_string = file_get_contents("mySettings.js");  
    $json_string = str_replace("var mySettings = ", "", $js_string);  
      
    $json = new Services_JSON();  
    var_dump($json->decode($json_string));
    

    Da sollte dann ein PHP-Objekt oder ein assoziatives Array rauskommen.

    Jeena