Michi: JS und PHP maximal nutzbare Zeilenlänge

Hallo,

ich versuche mir gerade ein PHP-Skript zu schreiben, das eine JS-Datei einliest, alle Kommentare und Tabulatoren und Zeilenumbrüche (und evtl. sonstigen Ballast) entfernt und als "bereinigte" JS-Datei wieder ausgibt.

Das Ergebnis ist aber leider (noch) nicht lauffähig und ich vermute, dass es daran liegen könnte, dass die eine Zeile in der das Skript steht einfach viel zu lang ist (ca. 100000 Zeichen).

Kann mir jemand sagen, wie lange einzelne Skriptzeilen für JS maximal sein dürfen? Ich habe da irgendwas um die 4000 Zeichen im Hinterkopf, aber da könnte ich mich auch täuschen.

Zudem würde mich interessieren, wie lange eine Zeichenkette, die ich an preg_replace in PHP übergebe maximal sein darf.
Ich habe mein PHP-Skript nämlich so aufgebaut, dass erst alle //-Kommentare nebst Zeilenumbrüchen zeilenweise in einer for-Schleife über den Array aus file('test.js') entfernt werden. Dann füge ich alles in einen Riesenstring zusammen, auf welchen ich dann preg_replace loslasse, um die /**/-Kommentare zu entfernen. (Das wäre so recht einfach, da ich dann nicht darauf achten muss, dass sich Kommentare über mehrere Zeilen erstrecken können)

Vielen Dank und viele Grüße

Michi

  1. Hi,

    ich versuche mir gerade ein PHP-Skript zu schreiben, das eine JS-Datei einliest, alle Kommentare und Tabulatoren und Zeilenumbrüche (und evtl. sonstigen Ballast) entfernt und als "bereinigte" JS-Datei wieder ausgibt.

    solltest Du jemals Hilfe bei diesem Script benötigen, so schalte diesen Mechanismus bitte ab.

    Das Ergebnis ist aber leider (noch) nicht lauffähig und ich vermute, dass es daran liegen könnte, dass die eine Zeile in der das Skript steht einfach viel zu lang ist (ca. 100000 Zeichen).

    Oder die Zeilen wurden nicht korrekt beendet. Sehr beliebt ist es, nach schließenden geschweiften Klammern das Semikolon zu vergessen.

    Kann mir jemand sagen, wie lange einzelne Skriptzeilen für JS maximal sein dürfen?

    Nach meinem Kenntnisstand liegt die Begrenzung im Bereich des (physikalischen und virtuellen) Arbeitsspeichers. Wobei dieser natürlich noch weitere Dinge aufnehmen muss.

    Ich habe da irgendwas um die 4000 Zeichen im Hinterkopf,

    Das waren Cookies.

    Zudem würde mich interessieren, wie lange eine Zeichenkette, die ich an preg_replace in PHP übergebe maximal sein darf.

    Auch hier propagiere ich o.g. Begrenzung.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo,

      solltest Du jemals Hilfe bei diesem Script benötigen, so schalte diesen Mechanismus bitte ab.

      Wiso, wenn man sich erstmal ein bisschen daran gewöhnt hat, dann ist es ganz leicht, die Matrix zu lesen ;-)
      Nein, Spaß beiseite. Die Größe des Skripts reduziert sich deutlich (bei mir von 150KB auf 100KB) und das finde ich ziemlich gut.

      Oder die Zeilen wurden nicht korrekt beendet. Sehr beliebt ist es, nach schließenden geschweiften Klammern das Semikolon zu vergessen.

      So auch bei mir. Aber bist Du sicher, dass die geschweifte Klammer in der Regel terminiert werden muss? - Sowas z.B. wirft in einer Zeile keinen Fehler:
      if(true) {alert("foo");} if(true) {alert("bar");}
      und auch das nicht:
      if(true) {alert("foo")} if(true) {alert("bar");}

      (Ich hab dazu schon gesucht, aber noch nichts tolles gefunden.)

      Kann mir jemand sagen, wie lange einzelne Skriptzeilen für JS maximal sein dürfen?

      Nach meinem Kenntnisstand liegt die Begrenzung im Bereich des (physikalischen und virtuellen) Arbeitsspeichers. Wobei dieser natürlich noch weitere Dinge aufnehmen muss.

      Aber so ganz sicher hört sich das auch nicht an?
      Hast Du vielleicht eine Idee, wo man sowas zum nachlesen finden könnte?

      Ich habe da irgendwas um die 4000 Zeichen im Hinterkopf,

      Das waren Cookies.

      Aja, da klingelt was bei mir.

      Zudem würde mich interessieren, wie lange eine Zeichenkette, die ich an preg_replace in PHP übergebe maximal sein darf.

      Auch hier propagiere ich o.g. Begrenzung.

      Hm, da bin ich ja noch skeptischer wie oben. (Leider habe ich auch dazu bisher nichts in der wirklich ausführlichen Doku bei php.net gefunden.)

      Vielen Dank und viele Grüße

      Michi

      1. Hallo,

        So auch bei mir. Aber bist Du sicher, dass die geschweifte Klammer in der Regel terminiert werden muss? - Sowas z.B. wirft in einer Zeile keinen Fehler:
        if(true) {alert("foo");} if(true) {alert("bar");}
        und auch das nicht:
        if(true) {alert("foo")} if(true) {alert("bar");}

        (Ich hab dazu schon gesucht, aber noch nichts tolles gefunden.)

        Ergänzung:
        Im ECMA 262 ([link href:http://www.ecma-international.org/publications/standards/Ecma-262.htm]) auf S. 21ff findet sich, denke ich der Grund dafür.
        Wenn ich es richtig verstehe, hast Du schon recht, dass der } eigentlich ein ; folgen muss. Aber wenn keiner folgt, dann greift unter bestimmten Bedingungen wohl die "Automatic Semicolon Insertion".
        (Allerdings habe ich es noch nicht ganz verstanden, in welchen Fällen sie nicht greift. Ein Fall wie das erste Bsp. unter 7.9.2 kommt bei mir eigentlich nicht vor.)

        Greets

        Michi

      2. Hi,

        Wiso, wenn man sich erstmal ein bisschen daran gewöhnt hat, dann ist es ganz leicht, die Matrix zu lesen ;-)

        richtig, ich sehe da gerade eine Rothaarige ... ;-)

        So auch bei mir. Aber bist Du sicher, dass die geschweifte Klammer in der Regel terminiert werden muss?

        Nein, nicht in der Regel. Aber häufig. Da viele glauben, sie müsse _nie_ terminiert werden, ist das ein beliebter Fehler.

        Nach meinem Kenntnisstand liegt die Begrenzung im Bereich des (physikalischen und virtuellen) Arbeitsspeichers. Wobei dieser natürlich noch weitere Dinge aufnehmen muss.
        Aber so ganz sicher hört sich das auch nicht an?

        Nein. Ich kann mir vorstellen, dass vereinzelte Systeme dem noch andere Beschränkungen auferlegen; so wie z.B. der IE, der an völlig willkürlichen Stellen URLs ein Ende setzt.

        Hast Du vielleicht eine Idee, wo man sowas zum nachlesen finden könnte?

        Ich bin nicht sicher, ob derlei Dinge offen dokumentiert werden; und sie rauszufinden dürfte nur selten passieren. Die Use-Cases für die Problematik sind eher schemenhaft zu finden.

        Zudem würde mich interessieren, wie lange eine Zeichenkette, die ich an preg_replace in PHP übergebe maximal sein darf.
        Auch hier propagiere ich o.g. Begrenzung.
        Hm, da bin ich ja noch skeptischer wie oben.

        Deinen Server hast Du im Griff. Teste es aus.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
    2. Hallo,

      jetzt funktionierts.

      Du hattest Recht: es gibt keine Begrenzung der Zeilenlänge (zumindest funktionierts mit meinen rund 100000 Zeichen noch).

      Ich hatte einfach noch einige kleinere Fehler im JS-Skript.
      (Und außerdem noch einen im PHP-Skript, weil ich in jeder Zeile einfach nur das letzte Zeichen entfernt habe (also den Umbruch). Dummerweise war das letzte Zeichen der letzen Zeile des JS-Skripts aber kein Umbruch sondern eine } - da hab ich am längsten gebraucht, bis ich das gefunden habe.)

      Ist eigentlich eine gute Debugging-Hilfe gewesen. Diese Fehler hätte ich sonst wahrscheinlich nie gefunden.

      Viele Grüße

      Michi

      1. Hi,

        (Und außerdem noch einen im PHP-Skript, weil ich in jeder Zeile einfach nur das letzte Zeichen entfernt habe (also den Umbruch). Dummerweise war das letzte Zeichen der letzen Zeile des JS-Skripts aber kein Umbruch sondern eine } - da hab ich am längsten gebraucht, bis ich das gefunden habe.)

        ich kriege immer eine mittelschwere Krise, wenn jemand die letzte Zeile einer Datei halbfertig stehen lässt. Eine Zeile ist erst dann eine Zeile, wenn sie beendet wurde. Mache Dir das zum Prinzip, dann ersparst Du Dir viele Probleme.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
    3. Hi,

      Sehr beliebt ist es, nach schließenden geschweiften Klammern das Semikolon zu vergessen.

      Also ich für meinen Teil lasse sie dort absichtlich weg - auch in komplexeren Scripts, die in einer Zeile stehen.

      Wenn Du mir einen Browser nennen kannst (irgendeinen, vom Navigator 2.0 angefangen bis zu aktuellen Browsern), der damit Probleme hat, wäre ich dankbar um Nennung.

      Gruß, Cybaer

      --
      Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
      1. Hallo,

        Sehr beliebt ist es, nach schließenden geschweiften Klammern das Semikolon zu vergessen.
        Also ich für meinen Teil lasse sie dort absichtlich weg - auch in komplexeren Scripts, die in einer Zeile stehen.

        Es war die Rede von "allesInEinerZeileJavaScriptCode" ;-). Da sind die Semikolons schon wichtig. Beispiel:

          
        var myf=function(){alert("Hallo Welt")} window.onload=function(){document.body.onclick=myf}  
        
        

        vs.

          
        var myf=function(){alert("Hallo Welt")};window.onload=function(){document.body.onclick=myf};  
        
        

        Wenn Du mir einen Browser nennen kannst (irgendeinen, vom Navigator 2.0 angefangen bis zu aktuellen Browsern), der damit Probleme hat, wäre ich dankbar um Nennung.

        Alle? ;-)

        viele Grüße

        Axel

      2. Wenn Du mir einen Browser nennen kannst (irgendeinen, vom Navigator 2.0 angefangen bis zu aktuellen Browsern), der damit Probleme hat, wäre ich dankbar um Nennung.

        Firefox, per JavaScript Console getestet:
        a={}; b={}; // Funktioniert.
        a={} b={}; // Fehler: Fehlendes ';' wird bemängelt.

        --
        Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
        Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
        1. Hallo.

          Firefox, per JavaScript Console getestet:
          a={}; b={}; // Funktioniert.
          a={} b={}; // Fehler: Fehlendes ';' wird bemängelt.

          Schau Dir mal an, was ich gestern noch unter Ergänzung hinzugefügt habe, da findest Du des Rätsels Lösung: "automatic semicolon insertion".

          Grüße

          Michi

          1. Schau Dir mal an, was ich gestern noch unter Ergänzung hinzugefügt habe, da findest Du des Rätsels Lösung: "automatic semicolon insertion".

            Das ist kein Rätsel, das Beispiel habe ich absichtlich gewählt, weil es so schön einfach ist. Da aber nach einem Browser gefragt wurde, der damit Probleme hat, habe ich den Firefox erwähnt, den ich ausgewählt habe, weil man es dort so schön und schnell testen kann.
            Das mit der "Automatic Semicolon Insertion" ist mir übrigens bekannt, ich habe mich allerdings entschieden, einfach die Semikolons zu setzen, um mir so nicht merken zu müssen, wann nun automatisch welche eingefügt werden und wann nicht. Bisher klappt es so ganz gut.

            --
            Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
            Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
        2. Hi,

          Firefox, per JavaScript Console getestet:
          a={}; b={}; // Funktioniert.
          a={} b={}; // Fehler: Fehlendes ';' wird bemängelt.

          LOL - kann es sein, daß die Object-Literale die *einzige* Ausnahme der "Kann-man-drauf-verzichten-'Regel'" sind (weil sie selbst keine Semikolon beinhalten dürfen)?

          Ich dachte zugegebenermaßen nicht an JSON, sondern an "normalen" Programmcode a la:

          for(i=0;i<5;i++) { if(i==2) { alert(0); } } if(i==5) { alert(1); } else { alert(2); } alert(i);

          Gruß, Cybaer

          --
          Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
          1. Hallo,

            Ich weiß nicht ganz, was hier für Verwirrung sorgt...

            a={} b={}; // Fehler: Fehlendes ';' wird bemängelt.
            LOL - kann es sein, daß die Object-Literale die *einzige* Ausnahme der "Kann-man-drauf-verzichten-'Regel'" sind (weil sie selbst keine Semikolon beinhalten dürfen)?

            Häh? ;) Man kann in einem solchen Fall nie auf ein Semikolon verzichten, wieso sollte ein Object-Literal eine Ausnahme sein?

            Nochmal das Beispiel:

            a = {} b = {};

            Würde man das einer linguistischen Konstituentenanalyse unterziehen :-),
            so sind das zwei (fehlerhafte) Expression Statements, in denen ein Identifier und ein Object-Literal mit einem Assignment Operator kombiniert werden.

            a = {} b = {};
            IWOWLLWIWOWLL
            EEEEEEWEEEEEEE
            I = Identifier, W = Whitespace, L = Object-Literal, E = Expression Statement

            Also letztlich nicht viel mehr als:
            a = 3 b = 4;
            Das ist genausowenig erlaubt. Object-Literale sind da keine Ausnahme.

            Identifier ersetzen wir mal durch andere Literale und den Operator wechseln wir auch. Syntaktisch ändern sich da wenig:
            1 + 2  3 + 4;
            ist auch aus denselben Gründen fehlerhaft.

            Noch einfacher, wir stellen nur zwei Literale/Werte nebeneinander (darauf laufen die obigen Ausdrücke beim auflösen sowieso hinaus):
            1 2;
            Das zeigt das Grundproblem. Hier gibts eine offene Expression mit einem (numerischen) Literal und danach gehts gleich - ohne verbindenden Operator - weiter mit einem weiteren Literal (oben wars ein Identifier, das kommt aufs selbe heraus). Das kann nur ein Fehler sein.

            Bei a = {} b = {}; läuft der Parser ganz normal bis zu m schließenden } des ersten Object-Literals - alle Zeichen werden normal in ihrer Bedeutung erkannt. Dann muss entweder die Expression zuende sein oder ein weiterer Operator folgen. Es folgt aber ein Literal. Zack, Syntaxfehler.

            for(i=0;i<5;i++) { if(i==2) { alert(0); } } if(i==5) { alert(1); } else { alert(2); } alert(i);

            Hier hast du abgeschlossene Statements, for und if-else. Durch die Klammerung ist ganz klar, wo deren Anweisungsblöcke sind. Zwischen diesen Statements sind selbstverständlich keine Semikola nötig!

            Das heißt,
            if (true) { alert("äh"); }; if (false) { alert("öh"); };
                                      ^
            dieses Semikolon wäre Unsinn.

            Das wäre syntaktisch nämlich:
            1. if-Statement
            2. Empty Statement
            3. if-Statement

            Das wäre zwar zulässig, aber genauso unsinnig wie
            ;;;;;;;;;;;;alert("Hallo");;;;;;;;;;;;;;alert("Hallo");;;;;;;;;;
            Die ganzen überflüssigen Semikola hier sind »leere« Statements. Syntaktisch völlig korrekt und legitim, aber gänzlich überflüssig. ;)

            Automatische Einfügung von Semikola tritt vor allem in zwei Fällen ein (ECMAScript):
            Voraussetzung: Der Parser tritt auf eine nicht identifizierbare Zeichenkette, die nicht in das vorige Statement/die vorige Expression hineinpassen kann.
            Fall 1, in dem ein vor dem Semikolon unidentifizierbaren String eingefügt wird: Vor dem String steht ein Zeilenumbruch.
            Fall 2: der String ist das Zeichen »}«.

            Das heißt, man kann schreiben (Fall 1)
            1 + 2
            3 + 4;
            wird zu
            1 + 2;
            3 + 4;
            (Um mich zu wiederholen: In einer Zeile geschrieben wäre 1 + 2  3 + 4; jedoch ein Fehler und es würde kein Semikolon eingefügt.)

            oder (Fall 2)

            if (bla) {
               1 + 2;
               3 + 4
            }
            wird zu
            if (bla) {
               1 + 2;
               3 + 4;
            }

            Das ist alles. Wenn der ganze Code in einer Zeile steht, kann nur Fall 2 eintreten. In deinem for-if-Beispiel werden gar keine Semikola eingesetzt. Die Syntax ist fehlerfrei und der Parser trifft auf nichts unvorhergesehenes oder zweideutiges.

            Letztlich lässt sich alles reduzieren auf:
            Mehrere vollständige, korrekte Statements können also ein einer Zeile stehen. for, if usw. bestehen nicht aus einem schließenden Semikolon, ein Expression Statement benötigt ein solches. Statements sind so angelegt, dass sie eindeutig geparst werden können ohne Berücksichtigung des Whitespaces.

            Mathias

            1. Das heißt,
              if (true) { alert("äh"); }; if (false) { alert("öh"); };
                                        ^
              dieses Semikolon wäre Unsinn.

              Genauso wie das hinter dem zweiten if-Statement, natürlich.

            2. Hi,

              Häh? ;) Man kann in einem solchen Fall nie auf ein Semikolon verzichten, wieso sollte ein Object-Literal eine Ausnahme sein?

              Es ging ausschließlich um notwendige Semikola hinter geschweiften Klammern. Timo hat ein (von mir nicht bedachtes, weil Inline noch nie genutzes) Beispiel gezeigt, wo sie notwendig sind, während in "meiner Programmierwelt" (aus von dir genannten Gründen) hinter geschweiften Klammern kein Semikolon notwendig ist.

              Von daher die "Ausnahme".

              Gruß, Cybaer

              --
              Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
      3. Hallo,

        Also ich für meinen Teil lasse sie dort absichtlich weg - auch in komplexeren Scripts, die in einer Zeile stehen.

        Wie ich gestern noch herausfand (siehe Ergänzung) ist das mit Vorsicht zu geniesen.

        Grüße

        Michi