Michi: RegEx Quantifizierungsmöglichkeit(?)

Hallo,

leider wusste ich für das Thema keinen besseren Titel, also verzeit mir bitte, falls dieser am Thema vorbei gehen sollte.

Ist ein regulärer Ausdruck in JS möglich, mit dem sich bestimmte "&" ersetzen lassen und zwar beliebig viele "&", aber nur, wenn es in beliebig vielen beliebigen Zeichen vor einem "=" mehr als ein mal vorkommt (das letzte vor dem "=" soll jedoch nicht ersetzt werden).
Beispiel:
&foo=blabla&bar&&blabla&bsp=foo
sollte z.B. ersetzt werden in:
&foo=blablaUNDbarUNDUNDblabla&bsp=foo

(Hintergrund (falls von Interesse): Derartige Strings werden per AJAX als Post an ein PHP-Skript übergeben, die "unerwünschten &" werden dann als nächste Postvariable interpretiert und als Folge tut das Skript nicht mehr das was gewünscht ist.)

Danke vielmals für Eure Hilfe und viele Grüße

Michi

  1. gudn tach!

    &foo=blabla&bar&&blabla&bsp=foo
    sollte z.B. ersetzt werden in:
    &foo=blablaUNDbarUNDUNDblabla&bsp=foo

    ich wuerde da mit gewoehnlichen stringoperationen vorgehen.
    a = pos(erstes & in str)
    b = pos(letztes & in str)
    str =  str[0..a]
         + ersetze("&" durch "UND" in str[a+1..b-1])
         + str[b..ende]

    (Hintergrund (falls von Interesse): Derartige Strings werden per AJAX als Post an ein PHP-Skript übergeben, die "unerwünschten &" werden dann als nächste Postvariable interpretiert und als Folge tut das Skript nicht mehr das was gewünscht ist.)

    waere es dann nicht moeglich, gleich "blablaUNDbarUNDUNDblabla" zu generieren, dort wo bisher die "&" erzeugt werden?

    prost
    seth

    1. Hallo,

      ich wuerde da mit gewoehnlichen stringoperationen vorgehen.
      a = pos(erstes & in str)
      b = pos(letztes & in str)
      str =  str[0..a]
           + ersetze("&" durch "UND" in str[a+1..b-1])
           + str[b..ende]

      Guter Tipp, da hab ich gar nicht drangedacht (das passiert mir leider viel zu oft, dass ich den Wald vor lauter Bäumen nicht mehr sehe ;-))

      waere es dann nicht moeglich, gleich "blablaUNDbarUNDUNDblabla" zu generieren, dort wo bisher die "&" erzeugt werden?

      Leider nur mit (zu) großem Aufwand (siehe Antwort auf wahsagas Post).

      Vielen Dank und viele Grüße

      Michi

  2. hi,

    Hintergrund (falls von Interesse): Derartige Strings werden per AJAX als Post an ein PHP-Skript übergeben, die "unerwünschten &" werden dann als nächste Postvariable interpretiert und als Folge tut das Skript nicht mehr das was gewünscht ist.

    Liegt denn &foo=blabla&bar&&blabla&bsp=foo bereits als ein String dem Script vor - oder wird dieser vom Script selber aus verschiedenen Formularfeldinhalten o.ä. zusammengesetzt?

    Bei letzterem solltest du einfach die Parameterwerte URL-gerecht kodieren (encodeURIComponent()), anstatt per RegEx irgendwelche ebenso abenteuerlichen wie aufwendigen Ersetzungen vorzunehmen.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo,

      Liegt denn &foo=blabla&bar&&blabla&bsp=foo bereits als ein String dem Script vor - oder wird dieser vom Script selber aus verschiedenen Formularfeldinhalten o.ä. zusammengesetzt?

      Ja. (aber...)

      Bei letzterem solltest du einfach die Parameterwerte URL-gerecht kodieren (encodeURIComponent()), anstatt per RegEx irgendwelche ebenso abenteuerlichen wie aufwendigen Ersetzungen vorzunehmen.

      Da hast Du natürlich vollkommen recht.

      ... leider habe ich beim programmiern ewig übersehen, dass mir "&" einen Fehler einbrockt.
      Nun habe ich zig verschiedene meist dynamisch generierte Formularfelder, die unterschiedliche Inhalte haben dürfen (manche auch HTML) und deren Inhalte dann auch gleich in der Seite angezeigt werden (WYSIWIG, (lange) bevor sie dann versendet werden). Deshalb kann ich die "&" nicht vor dem Versenden ersetzen (da sie sonst nicht mehr WYSIWIG angezeigt werden).
      Dummerweise versende ich an vielen verschiedenen Stellen im Script dann unterschiedliche Inhalte, wozu ich immer die Komponenten des Post entsprechend aufbaue (z.B.: post= "foo="+etwas.value+"&bar="+nochwas.innerHTML+usw.). Diesen String übergebe ich dann an eine Funktion die den Request ausführt.

      Wenn ich wie vorgeschlagen korrigieren will, muss ich es an vielen Stellen im Script ausbessern. Das ist a) ein ziemlichen Aufwand und b) hab ich Angst, dabei entweder wieder einen Fehler zu machen oder nochwas übersehen zu haben und mir damit wieder viel Korrekturaufwand einzuhandeln.
      Deshalb wäre mir eine zentrale Stelle, direkt vor dem Request lieber, sollten mir dann noch mehr Sachen auffallen, die Fehler verursachen, kann ich die schnell und einfach mitbehandeln.

      (Werd auf die Lösung die seth vorschlägt zurückgreifen.)

      Viele Grüße

      Michi

      1. Wenn ich wie vorgeschlagen korrigieren will, muss ich es an vielen Stellen im Script ausbessern. Das ist a) ein ziemlichen Aufwand und b) hab ich Angst, dabei entweder wieder einen Fehler zu machen oder nochwas übersehen zu haben und mir damit wieder viel Korrekturaufwand einzuhandeln.

        Das machst du vermutlich eher so wie du es jetzt vor hast.

        Du musst die URL Parameter in jedem Fall kodieren nicht nur das & Zeichen, d.h. früher oder später wird irgendein anderes Zeichen Probleme verursachen und dann kannst du wieder anfangen. Stattdessen einmal eine Funktion oder Methode bauen, die die URL Parameter zusammenbaut und entsprechend kodiert halte ich für weniger Aufwand, als zu warten bis das nächste Problem auftaucht.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Hallo,

          Du musst die URL Parameter in jedem Fall kodieren nicht nur das & Zeichen, d.h. früher oder später wird irgendein anderes Zeichen Probleme verursachen und dann kannst du wieder anfangen. Stattdessen einmal eine Funktion oder Methode bauen, die die URL Parameter zusammenbaut und entsprechend kodiert halte ich für weniger Aufwand, als zu warten bis das nächste Problem auftaucht.

          Da hast natürlich recht und ich werde es auch so machen. Danke, dass Du und wahsaga mich vor meiner angeplanten Dummheit doch noch bewahrt habt!

          Wiso eigentlich "URL Parameter"? Spricht man bei Post-Variable auch von URL-Parameter?

          Viele Grüße

          Michi

          1. Wiso eigentlich "URL Parameter"? Spricht man bei Post-Variable auch von URL-Parameter?

            nein, das war Blödsinn, da hab ich mal wieder was übersehen.

            Struppi.

            --
            Javascript ist toll (Perl auch!)
      2. hi,

        Dummerweise versende ich an vielen verschiedenen Stellen im Script dann unterschiedliche Inhalte, wozu ich immer die Komponenten des Post entsprechend aufbaue (z.B.: post= "foo="+etwas.value+"&bar="+nochwas.innerHTML+usw.). Diesen String übergebe ich dann an eine Funktion die den Request ausführt.

        Du hast also eine Dummheit erkannt und eingesehen - dann lasse dich bitte davor bewahren, gleich die nächste zu begehen :-)

        Wenn ich wie vorgeschlagen korrigieren will, muss ich es an vielen Stellen im Script ausbessern. Das ist a) ein ziemlichen Aufwand und b) hab ich Angst, dabei entweder wieder einen Fehler zu machen oder nochwas übersehen zu haben und mir damit wieder viel Korrekturaufwand einzuhandeln.

        Mit einer Bastellösung wie der angestrebten handelst du dir noch viel mehr Probleme ein.

        Gut, bei &foo=blabla&bar&&blabla&bsp=foo kannst du alles zwischen den beiden Gleichheitszeichen suchen, das letzte &... ignorieren, und dazwischen alle & ersetzen.

        Aber was machst du jetzt, wenn der _Inhalt_ von foo "blabla&bar=blubb&blabla" sein soll?
        Dann haben wir
        &foo=blabla&bar=blubb&blabla&bsp=foo

        • du suchst wieder den Inahlt zwischen zwei Gleichheitszeichen, findest also =blabla&bar=, berücksichtigst wieder das letzte &... nicht - und schon hast du einen neuen Parameter namens bar in deiner Übergabe, obwohl &bar=blubb gar keinen eigenen Parameter, sondern einen Teil des Inhalts von foo darstellen sollte.

        Deshalb wäre mir eine zentrale Stelle, direkt vor dem Request lieber,

        An diesem Punkt _kann_ es m.E. keine funktionierende Lösung mehr geben - weil du bei obigem Szenario nicht mehr sicher unterscheiden kannst, ob etwas als Parameterübergabe in der Form &parameter=wert gedacht war, oder ob dies Teil des Inhaltes eines anderen Parameters sein sollte.

        Mit der simplen, zu simplen Stringverkettung im Schritt davor hast du dir die Daten bereits "versaut", ihre Bedeutung ist nicht mehr eindeutig bestimmbar.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo,

          Du hast also eine Dummheit erkannt und eingesehen - dann lasse dich bitte davor bewahren, gleich die nächste zu begehen :-)

          Danke, dass Du und Struppi nochmal nachgehakt habt!!!
          Ich lasse mich jetzt doch davor bewahren.

          Mit einer Bastellösung wie der angestrebten handelst du dir noch viel mehr Probleme ein.

          Stimmt schon und mein Code wird noch hässlicher ;-)

          Gut, bei &foo=blabla&bar&&blabla&bsp=foo kannst du alles zwischen den beiden Gleichheitszeichen suchen, das letzte &... ignorieren, und dazwischen alle & ersetzen.

          Aber was machst du jetzt, wenn der _Inhalt_ von foo "blabla&bar=blubb&blabla" sein soll?
          Dann haben wir
          &foo=blabla&bar=blubb&blabla&bsp=foo

          Da könnte man fast die Dummheit begehen und fragen: Warum sollte jemand sowas "&&=&=&&&&=====&&&&===&&" eingeben?
          Aber da die Frage richtig lauten muss: Warum sollte jmd. NICHT sowas eingeben? - hast Du natürlich völlig recht.

          Danke nochmals und viele Grüße

          Michi

          1. hi,

            Danke, dass Du und Struppi nochmal nachgehakt habt!!!
            Ich lasse mich jetzt doch davor bewahren.

            Sehr gut :-)

            Die Kodierung der Daten zentral vorzunehmen, ist natürlich trotzdem eine gute Idee - anstatt das an x Stellen in den Code zu schreiben.

            Am einfachsten wäre es wohl, wenn du die Daten jeweils als Objekt übergibst:

              
            postData = {  
               'parametername1' : document.formularname.feldname1.value,  
               'parametername2' : document.formularname.feldname2.value  
            }
            

            Über die Eigenschaften und Werte dieses Objektes iterierst du dann mittels einer for-in-Schleife - und hängst dabei jeweils den Namen der Eigenschaft und ihren mit encodeURIComponent behandelten Wert mit einem Gleichheitszeichen dazwischen an deinen String, der die zu postenden Daten enthalten soll, an.

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. Hallo,

              postData = {
                 'parametername1' : document.formularname.feldname1.value,
                 'parametername2' : document.formularname.feldname2.value
              }

              
              >   
              > Über die Eigenschaften und Werte dieses Objektes iterierst du dann mittels einer [for-in-Schleife](http://de.selfhtml.org/javascript/sprache/schleifen.htm#for) - und hängst dabei jeweils den Namen der Eigenschaft und ihren mit encodeURIComponent behandelten Wert mit einem Gleichheitszeichen dazwischen an deinen String, der die zu postenden Daten enthalten soll, an.  
                
              Sehr schicke Lösung! For-in kannte ich noch gar nicht ;-) sehr hilfreich!  
                
              Vielen Dank und viele Grüße  
                
              Michi