Jogger: Gleicher Aufruf - unterschiedliche Ergebnisse

Hallo,
ich habe eine seltsamen Effekt.
Eine Prüfroutine (max8ziffern) wird zweimal aufgerufen,
das erste Mal, wenn ein Formularfeld geändert wird und ein zweites Mal, wenn das Formular abgesendet wird.
Die Pruefroutine befindet sich in einem externen Skript "pruefungen".
Ablauf:
Formulareingabe => Aufruf max8ziffern in pruefungen
Senden          => Aufruf Formulartest in pruefungen
                   In der Routine Formulartest Aufruf von max8ziffern
Die Funktion max8ziffern wird nur mit einem skalaren Wert versorgt.
Dieser wird mit einem regulären Ausdruck getestet.
Bei beiden Aufrufen ist der übergebene Wert identisch (zig-mal verifiziert)
Beim ersten Aufruf wird ein Fehler erkannt, beim zweiten nicht!

Jetzt habe ich zum "Spass" die Routine Feldtest nochmals unter einem anderen Namen angelegt und in der Routine Formulartest diese Routine aufgerufen.
Und siehe da, es läuft!

Die Routine ist ganz trivial:

function max8ziffern(s)
{
  if ( /([0-9]{9,})/g.test(s) )
    {return false}
  return true
}

Hat mir jemand eine Lösung?

  1. Moin!

    Die Routine ist ganz trivial:

    Macht aber nicht das, was ihr Name aussagt - entweder ist der Name falsch, oder der reguläre Ausdruck.

    function max8ziffern(s)
    {
      if ( /([0-9]{9,})/g.test(s) )
        {return false}
      return true
    }

    Du suchst in einem String ein Vorkommen von neun oder mehr Ziffern. Werden die gefunden, wird false zurückgegeben, ansonsten true.

    Heißt: "abcdefg12345678" ist korrekt laut deinem Test.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Dann habe ich jetzt zwei Fragen.
      1. Wie muss der Ausdruck heissen, wenn ich false haben will bei mehr 8 aufeinanderfolgende Ziffern (zulässig sind max. 8 Ziffern)?
      2: An Struppi: Ich glaube die Frage war klar: Warum unterschiedliche Ergebnisse beim zweimaligen Aufruf der Funktion mit gleichem Parameter?

      1. 2: An Struppi: Ich glaube die Frage war klar: Warum unterschiedliche Ergebnisse beim zweimaligen Aufruf der Funktion mit gleichem Parameter?

        Kann ich nicht nachvollziehen, ich kann die Funktion 1000 Mal aufrufen bekomme immer das gleiche Ergebniss, warum es bei dir anders ist, das kannst nur du uns sagen.

        Struppi.

        1. Kann ich nicht nachvollziehen, ich kann die Funktion 1000 Mal aufrufen bekomme immer das gleiche Ergebniss, warum es bei dir anders ist, das kannst nur du uns sagen.

          Danke, wenn ich es sagen könnte, würde ich nicht hier fragen.
          Es wäre nett, wenn Sie, Herr Struppi, sich mit derlei Aussagen zurückhalten würden.
          Man hat schon Kamele vor der Apotheke kotzen gesehen!
          Und blöd bin ich auch nicht, dass ich nicht vorher alles versuche, bevor ich das Forum bemühe.
          (siehe Aufruf der gleichen Routine mit anderem Namen beim zweiten Mal!)

          1. Moin!

            Kann ich nicht nachvollziehen, ich kann die Funktion 1000 Mal aufrufen bekomme immer das gleiche Ergebniss, warum es bei dir anders ist, das kannst nur du uns sagen.
            Danke, wenn ich es sagen könnte, würde ich nicht hier fragen.
            Es wäre nett, wenn Sie, Herr Struppi, sich mit derlei Aussagen zurückhalten würden.
            Man hat schon Kamele vor der Apotheke kotzen gesehen!
            Und blöd bin ich auch nicht, dass ich nicht vorher alles versuche, bevor ich das Forum bemühe.

            Du hast aber darauf verzichtet, deine zwei Aufrufe der Funktion vorzustellen.

            (siehe Aufruf der gleichen Routine mit anderem Namen beim zweiten Mal!)

            Wo ist das zu sehen?

            Stell die Seite online und verweise drauf. Alternativ stell eine Testseite mit minimalem Code, der das Problem reproduziert, online. Falls onlinestellen nicht geht, poste den Code hier.

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Du hast aber darauf verzichtet, deine zwei Aufrufe der Funktion vorzustellen.

              Der Aufruf ist, was den Inhalt des übergebenen Arguments angeht, völlig identisch. Ich habe daher keine Notwendigkeit gesehen, den Aufruf zu posten

              (siehe Aufruf der gleichen Routine mit anderem Namen beim zweiten Mal!)

              Wo ist das zu sehen?

              In meinem Beitrag habe ich geschrieben, dass ich zum "Spass" beim 2. Aufruf die gleiche Funktion mit anderem Namen verwendet habe und es dann funktioniert hat.

              Stell die Seite online und verweise drauf. Alternativ stell eine Testseite mit minimalem Code, der das Problem reproduziert, online. Falls onlinestellen nicht geht, poste den Code hier.

              onlinestellen kann ich nicht,
              werde versuchen, den Code so abzuspecken, dass ein posten sinnvoll ist.

              1. Moin!

                Du hast aber darauf verzichtet, deine zwei Aufrufe der Funktion vorzustellen.

                Der Aufruf ist, was den Inhalt des übergebenen Arguments angeht, völlig identisch. Ich habe daher keine Notwendigkeit gesehen, den Aufruf zu posten

                Ja, das behauptest du - und trotzdem führt es zu einer unterschiedlichen Behandlung. Also übersiehst du irgendwas, entweder beim Aufruf, oder bei irgendeinem Nebeneffekt, der dir unbeachtlich erscheint.

                werde versuchen, den Code so abzuspecken, dass ein posten sinnvoll ist.

                Das wäre hilfreich.

                Vor allem führt es wahrscheinlich dazu, dass der Fehler in der Miniversion nicht mehr auftritt, und du den Fehler findest.

                - Sven Rautenberg

                --
                "Love your nation - respect the others."
                1. werde versuchen, den Code so abzuspecken, dass ein posten sinnvoll ist.

                  Das wäre hilfreich.

                  Das wir etwas größeres!

                  Vor allem führt es wahrscheinlich dazu, dass der Fehler in der Miniversion nicht mehr auftritt, und du den Fehler findest.

                  Es ist aber definitiv so:
                  In der gerufenen Prüfung mache ich zuerst einen alert mit dem übergebenen Parameter und die Ausgabe ist bei beiden Aufrufen identisch,
                  da es sich um Ziffern handelt, wird es wohl auch nicht in einem Fall codiert sein und im anderen nicht?

                  1. Hallo Jogger,

                    da es sich um Ziffern handelt, wird es wohl auch nicht in einem Fall codiert sein und im anderen nicht?

                    nur Ziffern sind keine Garantie für eine Zahl: 12345 ist ungleich "12345".

                    Gruß, Jürgen

                2. Hallo,

                  ich habe abgespeckt und unten die Sources angegeben.
                  Ablauf:
                  In Textareafeld eingeben: 1234567890
                  In Textfeld springen
                     Ergebnis: false
                  Auf Senden klicken
                     Ergebnis: true

                  Wenn ich in der JS-Routine das mit max8ziffern identische max8ziffern1 aufrufe, kommt korrekterweise zweimal "false".

                  test.pl:

                    
                  #!/usr/bin/perl -w  
                  use strict;  
                  use warnings;  
                  use CGI;  
                  use CGI::Carp qw(fatalsToBrowser);  
                  my ($mitt);  
                  sub up1  
                    {formularausgabe();}  
                  sub up2  
                    {formularausgabe();}  
                  sub formularausgabe  
                    {  
                     use CGI qw(header);  
                     print header(-type=>'text/html; charset=ISO-8859-1');  
                    
                     print <<FORMULAR;  
                     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
                     <html>  
                     <head>  
                     <title>test</title>  
                     <script type="text/javascript" src="http://www.example.de/JS/testpruefungen.js"></script>  
                     </head>  
                     <body>  
                     <form action="http://www.example.de/cgi-bin/test.pl" method="post" name="test"  
                       onSubmit = "return formulartest(this)">  
                       <input type="hidden" name="aufruf" value="2">  
                       <textarea id="iMitteilung" name="Mitteilung" rows="2" cols="15"  
                             onchange="feldpruefung(this, 'max8ziffern')">$mitt</textarea>  
                       <input type="text" name="test" onchange="feldpruefung(this, 'max8ziffern')">  
                       <input name="Senden" value="Senden" type="submit">  
                    
                     </form>  
                     </body>  
                     </html>  
                  FORMULAR  
                    
                  }  
                    
                  my $cgi = new CGI;  
                  $mitt = $cgi->param('Mitteilung');  
                  if ($cgi->param('aufruf') == 2)  
                    {  
                     up2();  
                    }  
                  else  
                    {  
                    up1();  
                    }  
                    
                  exit 0;  
                  
                  

                  testpruefungen.js:

                    
                  function feldpruefung()  
                  {  
                   var tmpfld = arguments[0].value  
                    
                   // In Originalversion mehrere Prüfungen (arguments.length > 4)  
                   var i  
                   for(i = 1; i < arguments.length; i++)  
                     {alert((arguments[i] + "('" + tmpfld + "')"));  
                      if (!(eval(arguments[i] + "('" + tmpfld + "')")))  
                        {  
                         return false  
                        }  
                     }  
                   return true  
                  }  
                    
                  function formulartest(f)  
                     {  
                      return feldpruefung(document.getElementById("iMitteilung"), 'max8ziffern')  
                     }  
                    
                  function max8ziffern(s)  
                  {  
                  alert ("max8ziffern: " + s + " Ergebnis: " + !(/([0-9]{9,})/g).test(s));  
                   return !(/([0-9]{9,})/g).test(s)  
                  }  
                    
                  function max8ziffern1(s)  
                  {  
                  alert ("max8ziffern1: " + s + " Ergebnis: " + !(/([0-9]{9,})/g).test(s));  
                   return !(/([0-9]{9,})/g).test(s)  
                  }  
                  
                  
                  1. Mahlzeit,

                    test.pl:

                    1. Du beschreibst ein Javascript-Problem. Javascript läuft rein Client-seitig ab. Wieso postest Du also Perl-Code?

                    <form action="http://www.example.de/cgi-bin/test.pl" method="post" name="test"
                         onSubmit = "return formulartest(this)">
                         <input type="hidden" name="aufruf" value="2">
                         <textarea id="iMitteilung" name="Mitteilung" rows="2" cols="15"
                               onchange="feldpruefung(this, 'max8ziffern')">$mitt</textarea>
                         <input type="text" name="test" onchange="feldpruefung(this, 'max8ziffern')">

                    [...]

                    testpruefungen.js:

                    function feldpruefung()
                    {
                    var tmpfld = arguments[0].value

                    Wo ist hier das abschließende ";"?

                    // In Originalversion mehrere Prüfungen (arguments.length > 4)
                    var i

                    Wo ist hier das abschließende ";"?

                    for(i = 1; i < arguments.length; i++)
                       {alert((arguments[i] + "('" + tmpfld + "')"));
                        if (!(eval(arguments[i] + "('" + tmpfld + "')")))

                    "eval() is evil!". IMMER. Es besteht NIE die Notwendigkeit, eval() zu benutzen.

                    {
                           return false
                          }
                       }
                    return true
                    }

                    function formulartest(f)
                       {
                        return feldpruefung(document.getElementById("iMitteilung"), 'max8ziffern')

                    Wieso erwartet diese Funktion einen Parameter, wenn sie ihn doch überhaupt nicht benutzt?

                    }

                    function max8ziffern(s)
                    {
                    alert ("max8ziffern: " + s + " Ergebnis: " + !(/([0-9]{9,})/g).test(s));
                    return !(/([0-9]{9,})/g).test(s)
                    }

                    function max8ziffern1(s)
                    {
                    alert ("max8ziffern1: " + s + " Ergebnis: " + !(/([0-9]{9,})/g).test(s));
                    return !(/([0-9]{9,})/g).test(s)
                    }

                      
                    Was sagt Deine Javascript-Fehlerkonsole?  
                      
                      
                    MfG,  
                    EKKi  
                    
                    -- 
                    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                    
                    1. Hallo,

                      1. Du beschreibst ein Javascript-Problem. Javascript läuft rein Client-seitig ab. Wieso postest Du also Perl-Code?

                      Weil der Fehler nach meiner Erkenntnis in der Javascript-Routine auftritt.
                      Wenn ich es unter Perl gepostet hätte, hätte irgend jemand beim Anblick der alerts geschrieben "Wieso postest Du Javascript-Code".
                      Es gibt ja nun leider kein Thema "Perl und/oder javascript und/oder HTML und/oder .."

                      for(i = 1; i < arguments.length; i++)
                         {alert((arguments[i] + "('" + tmpfld + "')"));
                          if (!(eval(arguments[i] + "('" + tmpfld + "')")))

                      "eval() is evil!". IMMER. Es besteht NIE die Notwendigkeit, eval() zu benutzen.

                      Wie soll ich es sonst machen? Ich habe diese Routine aus irgendeinem (funktionierenden) Beispiel übernommen.

                      Wieso erwartet diese Funktion einen Parameter, wenn sie ihn doch überhaupt nicht benutzt?

                      }

                      function max8ziffern(s)
                      {
                      alert ("max8ziffern: " + s + " Ergebnis: " + !(/([0-9]{9,})/g).test(s));
                      return !(/([0-9]{9,})/g).test(s)
                      }

                      s ist kein Parameter?

                      Gruss
                      Jogger

                      1. Mahlzeit,

                        Hallo,

                        1. Du beschreibst ein Javascript-Problem. Javascript läuft rein Client-seitig ab. Wieso postest Du also Perl-Code?

                        Weil der Fehler nach meiner Erkenntnis in der Javascript-Routine auftritt.

                        Ich habe ja auch nicht bemängelt, dass Du Javascript-Code gepostet hast - das war gut und richtig so. Aber was soll der Perl-Code? Das Problem besteht im Javascript-Code und der läuft rein Client-seitig ab. Der Browser (inkl. seinem Javascript-Interpreter) bekommt NIEMALS Perl-Code zu sehen (außer der Webserver ist falsch konfiguriert). Wieso postest Du ihn also? Er ist für die Problemnachvollziehung und ggf. -findung vollkommen irrelevant.

                        Wenn ich es unter Perl gepostet hätte, hätte irgend jemand beim Anblick der alerts geschrieben "Wieso postest Du Javascript-Code".

                        Wieso hättest Du unter "Perl" posten sollen? Hast Du ein Perl-Problem?

                        Es gibt ja nun leider kein Thema "Perl und/oder javascript und/oder HTML und/oder .."

                        Nein. Muss es auch nicht. Wieso sollte es?

                        for(i = 1; i < arguments.length; i++)
                           {alert((arguments[i] + "('" + tmpfld + "')"));
                            if (!(eval(arguments[i] + "('" + tmpfld + "')")))

                        "eval() is evil!". IMMER. Es besteht NIE die Notwendigkeit, eval() zu benutzen.

                        Wie soll ich es sonst machen? Ich habe diese Routine aus irgendeinem (funktionierenden) Beispiel übernommen.

                        Was spricht dagegen, die relevanten also auszuführenden Funktionen direkt aufzurufen? Glaube mir und den meisten erfahrenen Teilnehmern des Forums(*): eval() ist NIE eine Lösung - Du handelst Dir damit im Regelfall größere Probleme ein, als wenn Du es gleich von Anfang an sauber programmierst.

                        Wieso erwartet diese Funktion einen Parameter, wenn sie ihn doch überhaupt nicht benutzt?

                        }

                        function max8ziffern(s)
                        {
                        alert ("max8ziffern: " + s + " Ergebnis: " + !(/([0-9]{9,})/g).test(s));
                        return !(/([0-9]{9,})/g).test(s)
                        }

                        s ist kein Parameter?

                        Ich meinte die Funktion "formulartest()", die ich auch zitiert und DARUNTER meinen Kommentar verfasst habe.

                        MfG,
                        EKKi

                        --
                        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                        1. Hallo,

                          Ich meinte die Funktion "formulartest()", die ich auch zitiert und DARUNTER meinen Kommentar verfasst habe.

                          Weiß ich wohl, aber
                          Zitat: "arguments" ist eine lokale Variable, die es in allen JavaScript-Funktionen gibt. Sie stellt die tatsächlich übergebenen Parameter dar,"
                          Ende Zitat

                          Wie man unschwer erkennen kann, kann die Funktion unterschiedlich viele Parameter empfangen.

                          MfG
                          Jogger

                          1. Hi,

                            Ich meinte die Funktion "formulartest()", die ich auch zitiert und DARUNTER meinen Kommentar verfasst habe.
                            Zitat: "arguments" ist eine lokale Variable, die es in allen JavaScript-Funktionen gibt. Sie stellt die tatsächlich übergebenen Parameter dar,"

                            ja, das stimmt ja auch. Deine Funktion formulartest() macht davon allerdings keinen Gebrauch. Ich zitiere aus deinem Codeauszug:

                            function formulartest(f)
                               {
                                return feldpruefung(document.getElementById("iMitteilung"), 'max8ziffern')
                               }

                            Du verwendest da weder das Argument f, noch greifst du über arguments[] anonym auf die Argumente zu.

                            So long,
                             Martin

                            --
                            F: Was sagt die kleine Kerze zur großen Kerze?
                            A: Ich gehe heute nacht aus!
                            1. Hallo,
                              jetzt weiss ich was ihr meint.
                              Habe immer im Original-Skript geschaut, das ist natürlich wesentlich umfangreicher und dort wird der Parameter verwendet.
                              Beim Abspecken übersehen - Hat aber, wie bereits festgestellt, nichts mit dem Fehler zu tun.
                              Gruß
                              Jogger

                  2. Hallo,
                    Ergänzung zum letzten Beitrag:
                    Der Effekt tritt auch auf,
                    wenn im Textareafeld 123456789 eingegeben wird,
                    dann zum nächsten Feld gegangen wird,
                    dann wieder das Textareafeld korrigiert wird (z.B eine weitere Ziffer)
                    und wieder zum Textfeld gegangen wird.
                    Erste Prüfung false, zweite true.

                    1. Hallo,

                      Der Effekt tritt auch auf,
                      wenn im Textareafeld 123456789 eingegeben wird,
                      dann zum nächsten Feld gegangen wird,
                      dann wieder das Textareafeld korrigiert wird (z.B eine weitere Ziffer)
                      und wieder zum Textfeld gegangen wird.
                      Erste Prüfung false, zweite true.

                      Das eval() lässt sich umgehen, indem du die Funktion selbst als Parameter übergibst, nicht nur deren Namen.
                      Also statt:
                      <input type="text" name="test" onchange="feldpruefung(this, 'max8ziffern')">
                      einfach nur:
                      <input type="text" name="test" onchange="feldpruefung(this, max8ziffern)">

                      Wie auch immer.. Kannst du nicht die fertige Seite verlinken, die das Problem verursacht, damit man es bequemer nachvollziehen kann?
                      Der Perl-Code interessiert hier wirklich nicht und es ist ziemlich kompliziert, sich ein Bild vom Ergebnis deines Perl-HTML-JS-Wirrwarrs zu machen.

                      Gruß, Don P

                      1. Hallo,

                        Wie auch immer.. Kannst du nicht die fertige Seite verlinken, die das Problem verursacht, damit man es bequemer nachvollziehen kann?

                        Die gibts nicht im Internet.

                        Der erzeugte HTML-Code ist unten, wenn ich daraus ein Dokument mache und es aufrufe, passiert das gleiche.

                          
                        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
                           <html>  
                           <head>  
                           <title>test</title>  
                           <script type="text/javascript" src="http://www.example.de/JS/testpruefungen.js"></script>  
                           </head>  
                           <body>  
                           <form action="http://www.example.de/cgi-bin/test.pl" method="post" name="test"  
                             onSubmit = "return formulartest(this)">  
                          
                             <input type="hidden" name="aufruf" value="2">  
                             <textarea id="iMitteilung" name="Mitteilung" rows="2" cols="15"  
                                   onchange="feldpruefung(this, 'max8ziffern')"></textarea>  
                             <input type="text" name="test" onchange="feldpruefung(this, 'max8ziffern')">  
                             <input name="Senden" value="Senden" type="submit">  
                          
                           </form>  
                           </body>  
                           </html>  
                        
                        
                        1. Der erzeugte HTML-Code ist unten, wenn ich daraus ein Dokument mache und es aufrufe, passiert das gleiche.

                          Evtl. hast du es übersehen, ich hab dir die Lösung bereits gepostet

                          Struppi.

                        2. Hallo,

                          Der erzeugte HTML-Code ist unten, wenn ich daraus ein Dokument mache und es aufrufe, passiert das gleiche.

                          Ok, ich hab's jetzt nachvollziehen können, und wie ich bereits vorher geschrieben habe, taugt deine Funktion max8ziffern nicht, speziell der reguläre Ausdruck taugt NICHT:

                          DU BENüTZT UNNÖTIG g und UNNÖTIG DIE KLAMMERN () IM REGULÄREN KUCKUCK, ÄH AUSDRUCK !!

                          Klammerung ist nur angesagt, wenn man das gefundene anschließend auswertet, und g ist nur angesagt, wenn man mehrere Treffer erwartet, die man anschließend auswertet.

                          Wenn du diese Ratschläge berücksichtigst und es so notierst, funktioniert alles wie erwartet:

                          function max8ziffern(s)
                          {
                          alert ("max8ziffern: " + s + " Ergebnis: " + !( /[0-9]{9,}/.test(s)) );
                           return !( /[0-9]{9,}/.test(s) );
                          }

                          Gruß, Don P

                          1. Hallo,

                            Klammerung ist nur angesagt, wenn man das gefundene anschließend auswertet, und g ist nur angesagt, wenn man mehrere Treffer erwartet, die man anschließend auswertet.

                            Auch hier gilt, was ich an anderer Stelle geschrieben habe,
                            ich habe die Skripte abgespeckt ohne dass der Effekt verloren ging.
                            Im Originalskript werden Informationen ausgegeben über die gefundenen Strings.
                            Ich benötige also die Klammern unbedingt. Das g war vorgesehen für die Information, dass der Suchstring möglicherweise mehrfach vorkommt.

                            Wenn du diese Ratschläge berücksichtigst und es so notierst, funktioniert alles wie erwartet:

                            Wenn ich den Ratschlag von Struppi beherzige, funktioniert es auch und zwar sogar mit den Klammern  u n d   dem "g".

                            Es stellt sich also die Frage, warum es in meiner Variante mit "g" nicht funktioniert.

                            1. Hi,

                              Wenn ich den Ratschlag von Struppi beherzige, funktioniert es auch und zwar sogar mit den Klammern  u n d   dem "g".
                              Es stellt sich also die Frage, warum es in meiner Variante mit "g" nicht funktioniert.

                              Weil ein und dasselbe Regex-Objekt benutzt wird.

                              Beim ersten Aufruf von test wird vom String-Anfang an gesucht, die erste Folge von ausreichend vielen Ziffern wird gefunden.

                              Beim zweiten Aufruf wird aufgrund des g-Flags dort weitergemacht, wo beim ersten Mal das Ende des Treffers war.
                              Wenn der String nur eine ausreichend lange Zifferngruppe enthält, wird bei dieser zweiten Suche nichts mehr gefunden.

                              Beim dritten Aufruf würde dann, da die zweite Suche das Stringende erreicht hat, wieder am Stringanfang begonnen (IIRC).

                              Ohne das g-Flag wird bei jedem Aufruf von test zuerst die Suchposition auf den Stringanfang gesetzt.

                              Und wenn jedes Mal mit new ein neues Regex-Objekt erzeugt wird, wird auch jedesmal am Stringanfang mit der Suche begonnen, weil das bei einem neuen Regex-Objekt immer so ist.

                              cu,
                              Andreas

                              --
                              Warum nennt sich Andreas hier MudGuard?
                              O o ostern ...
                              Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                              1. Hallo Andreas,
                                das erklärt das Verhalten, aber ist dies logisch?

                                Nach meinem bisherigen Kenntnissstand liefert ein regulärer Ausdruck bei einmaligem Aufruf bei Angabe von g bereits alle Fundstellen
                                (siehe auch Selfhtml:
                                g sucht/ersetzt alle Fundstellen (ansonsten wird nur die erste Fundstelle ersetzt)

                                Gruss
                                Jogger

                                1. Hi,

                                  das erklärt das Verhalten, aber ist dies logisch?

                                  ja.

                                  g sucht/ersetzt alle Fundstellen (ansonsten wird nur die erste Fundstelle ersetzt)

                                  Du hast aber nicht replace, sondern test aufgerufen.

                                  cu,
                                  Andreas

                                  --
                                  Warum nennt sich Andreas hier MudGuard?
                                  O o ostern ...
                                  Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                                  1. Moin!

                                    g sucht/ersetzt alle Fundstellen (ansonsten wird nur die erste Fundstelle ersetzt)

                                    Du hast aber nicht replace, sondern test aufgerufen.

                                    Wir müssen immer noch klären, was der reguläre Ausdruck denn nun tatsächlich finden soll.

                                    Sind Buchstaben in dem Feld OK? Laut Regex ja, laut Funktionsname eher nein.

                                    Sind Konstrukte wie 123abc456 OK?

                                    - Sven Rautenberg

                                    --
                                    "Love your nation - respect the others."
                              2. Hallo,

                                Ohne das g-Flag wird bei jedem Aufruf von test zuerst die Suchposition auf den Stringanfang gesetzt.

                                Und wenn jedes Mal mit new ein neues Regex-Objekt erzeugt wird, wird auch jedesmal am Stringanfang mit der Suche begonnen, weil das bei einem neuen Regex-Objekt immer so ist.

                                Eben, so habe ich mir das nämlich auch gedacht, und somit steht folgendes doch eigentlich als Lüge da:

                                Im Originalskript werden Informationen ausgegeben über die gefundenen Strings.
                                Ich benötige also die Klammern unbedingt. Das g war vorgesehen für die Information, dass der Suchstring möglicherweise mehrfach vorkommt.

                                [...]

                                Wenn ich den Ratschlag von Struppi beherzige, funktioniert es auch und zwar sogar mit den Klammern  u n d   dem "g".

                                Oder zumindest funktioniert es nicht *wirklich* so wie im Originalskript, falls das überhaupt funktionierte...

                                Gruß, Don P

                  3. ich habe abgespeckt und unten die Sources angegeben.

                    einfacher wäre es gewesen, grad die lauffähige Ausgabe zu zeiugen, so müßen die dir helfen wollen erstmal alles so zurecht kopieren dass es überhaupt läuft.

                    Ablauf:
                    In Textareafeld eingeben: 1234567890
                    In Textfeld springen
                       Ergebnis: false
                    Auf Senden klicken
                       Ergebnis: true

                    Wenn ich in der JS-Routine das mit max8ziffern identische max8ziffern1 aufrufe, kommt korrekterweise zweimal "false".

                    Nicht wenn du in beiden Vergleichen die gleiche Funktion aufrufst.

                    function feldpruefung()
                    {
                    var tmpfld = arguments[0].value

                    // In Originalversion mehrere Prüfungen (arguments.length > 4)
                    var i
                    for(i = 1; i < arguments.length; i++)
                       {alert((arguments[i] + "('" + tmpfld + "')"));
                        if (!(eval(arguments[i] + "('" + tmpfld + "')")))
                          {
                           return false
                          }
                       }
                    return true

                    Statt dem unschönen eval, kannst du hier die Funktionen so aufrufen:

                    [code lang=javascript]windowarguments[i]

                      
                    Aber jetzt zum eigentlichen Problem.  
                      
                    
                    > function max8ziffern(s)  
                    > {  
                    > alert ("max8ziffern: " + s + " Ergebnis: " + !(/([0-9]{9,})/g).test(s));  
                    >  return !(/([0-9]{9,})/g).test(s)  
                    > }  
                      
                    Ich weiß gar nicht mehr warum das so war, aber dadurch dass du hier einen fixen Regulären Ausdruck verwendest wird dieser immer abwechselnde Ergebnise haben, um das zu vermeiden musst du den Ausdruck mit new regExp() zusammenbauen  
                      
                    ~~~javascript
                    function max8ziffern(s) {  
                     var r = new RegExp(/([0-9]{9,})/);  
                     return !r.test(s)  
                    }  
                    
                    

                    Struppi.

                    1. Ja, habe ich übersehen, inzwischen aber getestet und es funktioniert.
                      Dafür herzlichen Danke.
                      Allerdings kann ich mir nicht verkneifen, Dich zu zitieren:

                      Kann ich nicht nachvollziehen, ich kann die Funktion 1000 Mal aufrufen bekomme immer das gleiche Ergebniss, warum es bei dir anders ist, das kannst nur du uns sagen.

                      Ich konnte es Euch nicht sagen, zum Glück aber Du.

                      Eine Frage an alle Mitleser:
                      Weiß jemand, warum dieses "new" sein muss?
                      Dies ist mir noch nirgendwo so vorgekommen, da bin ich ganz der Meinung von Struppi (etwas abgewandelt): 1000 mal probiert, immer das gleiche passiert.
                      Gruss
                      Jogger

                      1. Allerdings kann ich mir nicht verkneifen, Dich zu zitieren:

                        Kann ich nicht nachvollziehen, ich kann die Funktion 1000 Mal aufrufen bekomme immer das gleiche Ergebniss, warum es bei dir anders ist, das kannst nur du uns sagen.

                        Ich konnte es Euch nicht sagen, zum Glück aber Du.

                        Das Problem war, du hast am Anfang keine Testumgebung gezeigt. Nur mit der Funktion alleine, gab es erstmal kein Problem, ein minimaler Test hätte z.b. so ausgesehen:

                           <form action="#">  
                             <input  
                                   onchange="max8ziffern(this.value)"  
                             onblur="max8ziffern(this.value)"  
                             value=""1234567890">  
                          
                           </form>  
                           <script type="text/javascript">  
                        function max8ziffern(s)  
                        {  
                        alert ("max8ziffern: " + s + " Ergebnis: " + !(/([0-9]{9,})/g).test(s));  
                        }  
                        </script>
                        

                        Das Problem tritt auch nur dann auf, wenn ein false erzeugt wird.

                        Weiß jemand, warum dieses "new" sein muss?
                        Dies ist mir noch nirgendwo so vorgekommen, da bin ich ganz der Meinung von Struppi (etwas abgewandelt): 1000 mal probiert, immer das gleiche passiert.

                        Wir hatten das Problem vor kurzem hier im Forum, ich weiß aber nicht mehr was dabei als Erklärung rausgekommen ist und wer an der Lösung beteiligt war.

                        Struppi.

          2. Kann ich nicht nachvollziehen, ich kann die Funktion 1000 Mal aufrufen bekomme immer das gleiche Ergebniss, warum es bei dir anders ist, das kannst nur du uns sagen.
            Danke, wenn ich es sagen könnte, würde ich nicht hier fragen.

            Was soll das?

            Es wäre nett, wenn Sie, Herr Struppi, sich mit derlei Aussagen zurückhalten würden.

            Die 100% richtig ist, entweder du verschweigst uns etwas oder bei dir spukts, aber so wie du es beschreibst geht es nicht.

            Man hat schon Kamele vor der Apotheke kotzen gesehen!

            Ich nicht.

            Und blöd bin ich auch nicht, dass ich nicht vorher alles versuche, bevor ich das Forum bemühe.

            Mag ja stimmen, trotzdem kann dir mit deiner Beschreibung keiner helfen.

            (siehe Aufruf der gleichen Routine mit anderem Namen beim zweiten Mal!)

            Was immer das heißen soll. Du hast die Funktion umbenannt, schön. Vielleicht gibt es irgendwelche Wechselwirkungen mit irgendetwas was noch irgendwie auf deiner Seite aktiv ist, aber warum sollen wir rumraten wenn wir dir so sowieso nicht hlefen können?
            Darauf hab ich dich aufmerksam gemacht und du kannst dich auf den Kopd stellen, daran ändert sich nichts.

            Struppi.

      2. Mahlzeit,

        1. Wie muss der Ausdruck heissen, wenn ich false haben will bei mehr 8 aufeinanderfolgende Ziffern (zulässig sind max. 8 Ziffern)?

        Darf sonst noch was enthalten sein? Also Buchstaben, Sonderzeichen usw.? Oder soll der gesamte Inhalt nur aus Ziffern bestehen, von denen es maximal 8 geben darf?

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Die Routine ist ganz trivial:

    function max8ziffern(s)
    {
      if ( /([0-9]{9,})/g.test(s) )
        {return false}
      return true
    }

    function max8ziffern(s)  
    {  
      return  !(/([0-9]{9,})/g).test(s);  
    }
    

    Hat mir jemand eine Lösung?

    Wofür?

    Struppi.

  3. Hallo,

    Die Routine ist ganz trivial:

    function max8ziffern(s)
    {
      if ( /([0-9]{9,})/g.test(s) )
        {return false}
      return true
    }

    Hat mir jemand eine Lösung?

    Ich denke mal, dass es an dem /g-Modifier liegt. Der Suchausdruck wird dadurch mehrfach gesucht, was mir unnötig scheint. Wenn er gefunden wird, ist das Ergebnis false, sonst true, basta. Nimm mal das g weg, und alles wird gut, inschalla.

    Gruß, Don P

    1. Hallo,

      Im Übrigen liefert /([0-9]{9,})/g.test(s) immer einen booleschen Wert, so dass deine Funktion besser so notiert werden sollte:

        
      function max8ziffern(s)  
      {  
        return /[0-9]{9,}/.test(s);  
      }  
      
      

      Gruß, Don P

    2. Nimm mal das g weg, und alles wird gut, inschalla.

      Schön wärs gewesen.