Ankündigung

Einklappen
Keine Ankündigung bisher.

Abfrage auf bestimmte Zeichen im form

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Abfrage auf bestimmte Zeichen im form

    Guten Morgen zusammen

    Ich schreibe gerade an einem Formular, bei dem ein bestimmtes Feld nur die folgenden Zeichen enthalten darf:

    Code:
    a-zA-Z0-9.-_+
    Die Sonderzeichen dürfen allerdings weder an der ersten noch an der letzten Stelle stehen.
    Außerdem darf das Feld nur 20 Zeichen lang sein (wobei dass imo auch irgendwie im Formular selbst direkt abgefrühstückt werden kann ... da muss ich nochmal genauer nach suchen).

    In einem weiteren Schritt (für eine zweite Funktion, nicht aber für die erste Auswertung) müssen dann alle Punkte in Doppelpunkte gewechselt werden.

    Ich weiß, dass ich sowas irgendwie mit einer regex in einer IF-Abfrage lösen kann ... aber ein hilfreiches Tutorial für regex für Einsteiger habe ich leider noch nicht finden können. Wenn ich danach Google finde ich zwar viele Beispiele, diese sind für mich aber leider kaum nachvollziehbar.

    Kann mir da ggf. eine oder einer von euch weiterhelfen?

  • #2
    hier kannst Du nach Herzenslust probieren http://www.phpliveregex.com/

    Kommentar


    • #3
      http://www.regexr.com/

      Ist meiner Meinung nach ein gutes Mittel um RegEx's schnell zu testen.
      Dort sind auch Beispiele und die einzelnen Operatoren zu finden.

      Ansonsten hier mal ein Einstieg mit dem du weitermachen kannst:

      /[a-zA-Z0-9]{1}[\w.\-\_\+]{1,18}[a-zA-Z0-9]{1}/

      Viel Glück das so umzubauen dass es genau auf deinen Fall passt.
      Zitat von derwunner
      "Ein FISI ist auf gut-deutsch der Netzwerker. Das heißt Du gehst rauß zum Kunden oder auf die Straße und verlegst Leitungen" - derwunner 2015

      Kommentar


      • #4
        Zitat von CrocoBlack Beitrag anzeigen
        http://www.regexr.com/


        Ansonsten hier mal ein Einstieg mit dem du weitermachen kannst:

        /[a-zA-Z0-9]{1}[\w.\-\_\+]{1,18}[a-zA-Z0-9]{1}/

        Viel Glück das so umzubauen dass es genau auf deinen Fall passt.
        ... und dabei das Verankern an Anfang und Ende der Zeichenkette nicht vergessen.
        Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

        Kommentar


        • #5
          Zitat von fireweasel Beitrag anzeigen
          ... und dabei das Verankern an Anfang und Ende der Zeichenkette nicht vergessen.
          Richtig, allerdings sollte das ja auch nur ein Ansatz sein und keine Fertiglösung
          Zitat von derwunner
          "Ein FISI ist auf gut-deutsch der Netzwerker. Das heißt Du gehst rauß zum Kunden oder auf die Straße und verlegst Leitungen" - derwunner 2015

          Kommentar


          • #6
            Wie auch noch einer https://regex101.com/

            Meines Erachtens hat die PHP Doku eine gute PCRE Doku: http://php.net/manual/de/reference.p...ern.syntax.php

            Die Sonderzeichen dürfen allerdings weder an der ersten noch an der letzten Stelle stehen.
            Welche "Sonerzeichen"?

            Zitat von CrocoBlack
            PHP-Code:
            [a-zA-Z0-9]{1
            Das zB matched auf genau eines der Zeichen von den Werten in der Klammer. Wenn du den modifier /i verwendest brauchst du Groß- und Kleinschreibung nicht extra auswerten, und schau dir mal \w an http://php.net/manual/de/regexp.reference.escape.php was ein Word-Character ist steht weiter unten.

            LG
            The string "()()" is not palindrom but the String "())(" is.

            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              Also wenn ich die regex
              Code:
              /^([a-z0-9]{1}[a-z0-9\.\-\_\+]{1,18}[a-z0-9]{1})\w+/
              auf regexr verwende, dann wird mir bei den Test-Strings
              Code:
              test #
              0test #
              test0 #
              tes #
              te
              .test
              test.
              test.test #
              test test
              _test
              test_
              -test
              test-
              test-test #
              test_test #
              nur der oberste als gültig angezeigt.
              Richtig wären aber alle mit einer # dahinter.

              Bei einer Übersetzung des (eh nicht funktionierenden) Codes zu php (sofern richtig übersetzt) ...

              PHP-Code:
              <?php 
              $var 
              = array("1"=>"singleword","2"=>"with space","3"=>"dot.dot","4"=>".leadingdot","5"=>"tailingdot.","6"=>"hyphen-hypen","7"=>"-leadinghyphen","8"=>"tailinghyphen-","9"=>"underscore_underscore","10"=>"_leadingunderscore","11"=>"tailingunderscore_","12"=>"plus+plus","13"=>"+leadingplu","14"=>"tailingplu+");

              for (
              $i=1;$i<15;$i++) {
                  if (
              preg_match("/^([a-z0-9]{1}[a-z0-9\.\+\_\-]{1,18}[a-z0-9]{1})\w+/ig",$var[$i])) {
                      echo 
              "Ausdruck: ".$var[$i]." ist gültig!</br>";
                  }    
                  else { echo 
              "Ausdruck: ".$var[$i]." ist ungültig!</br>"; }
              }
              ?>
              ... führt zum Fehler
              Warning: preg_match(): Unknown modifier 'g' in C:\xampp\htdocs\regex.php on line 5
              .
              Außerdem wird bei allen ausgegeben, sie seien ungültig (was auch wieder für eine fehlerhafte regex spricht

              Kommentar


              • #8
                PHP-Code:
                /^([a-z0-9]{1}[a-z0-9\.\+\_\-]{1,18}[a-z0-9]{1})$/
                Versuchs mal hiermit.

                Edit: Als erklärung: \w beinhaltet _, trifft also bei mir "test_", gleichzeitig sagst du ihm mit deinem RegEx, dass es mindestens 4 Zeichen sein müssen.
                1 am Anfang, 1-18 in der Mitte, 1 am Ende und dann noch 1 "oder mehr" (\w+) ganz am Ende.

                Warum dein RegEx bei dir allerdings nur den ersten trifft ist mir unklar, der müsste viel mehr treffen. Bei mir trifft er alle die er treffen soll ausser "tes".
                Zitat von derwunner
                "Ein FISI ist auf gut-deutsch der Netzwerker. Das heißt Du gehst rauß zum Kunden oder auf die Straße und verlegst Leitungen" - derwunner 2015

                Kommentar


                • #9
                  Er hat oben auf jeden Fall die String-Ende $ vergessen.
                  The string "()()" is not palindrom but the String "())(" is.

                  Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                  PHP.de Wissenssammlung | Kein Support per PN

                  Kommentar


                  • #10
                    Ich hab es jetzt in php nochmal angepasst.

                    PHP-Code:
                    <?php 
                    $var 
                    = array("1"=>"singleword","2"=>"with space","3"=>"dot.dot","4"=>".leadingdot","5"=>"tailingdot.","6"=>"hyphen-hypen","7"=>"-leadinghyphen","8"=>"tailinghyphen-","9"=>"uscore_uscore","10"=>"_leadinguscore","11"=>"tailinguscore_","12"=>"plus+plus","13"=>"+leadingplus","14"=>"tailingplus+","15"=>"srt","16"=>"vs","17"=>"longstringtooverflowthemaxlength");

                    for (
                    $i=1;$i<=17;$i++) {
                        if (
                    preg_match("/^([a-z0-9]{1}[a-z0-9.+_-]{1,18}[a-z0-9]{1})$/i",$var[$i])) {
                            echo 
                    "Ausdruck: ".$var[$i]." ist gültig!</br>";
                        }    
                        else { echo 
                    "Ausdruck: ".$var[$i]." ist ungültig!</br>"; }
                    }
                    ?>
                    Code:
                    Ausdruck: singleword ist gültig!
                    Ausdruck: with space ist ungültig!
                    Ausdruck: dot.dot ist gültig!
                    Ausdruck: .leadingdot ist ungültig!
                    Ausdruck: tailingdot. ist ungültig!
                    Ausdruck: hyphen-hypen ist gültig!
                    Ausdruck: -leadinghyphen ist ungültig!
                    Ausdruck: tailinghyphen- ist ungültig!
                    Ausdruck: uscore_uscore ist gültig!
                    Ausdruck: _leadinguscore ist ungültig!
                    Ausdruck: tailinguscore_ ist ungültig!
                    Ausdruck: plus+plus ist gültig!
                    Ausdruck: +leadingplus ist ungültig!
                    Ausdruck: tailingplus+ ist ungültig!
                    Ausdruck: srt ist gültig!
                    Ausdruck: vs ist ungültig!
                    Ausdruck: longstringtooverflowthemaxlength ist ungültig!
                    Ich würde sagen, dass wäre dann, was ich brauche

                    Als nächstes brauch ich dann nen preg_replace, um alle Punkte mit Doppelpunkten zu ersetzen.

                    PHP-Code:
                    if (preg_match("/^(\.)$/i",$var[$i])) {
                        
                    $var[$i] = preg_replace("/^(\.)$/i","\:",$var[$i]);
                        echo 
                    "Ausdruck: ".$var[$i]." wurde überarbeitet!</br>";

                    Aber da muss ich noch dran feilen. Im Code selbst scheint kein Fehler zu sein, denn die Seite läd korrekt. Nur wird die innere IF halt nicht durchlaufen.

                    Kommentar


                    • #11
                      Als nächstes brauch ich dann nen preg_replace, um alle Punkte mit Doppelpunkten zu ersetzen.
                      Nö, str_replace(), strtr(), ...
                      The string "()()" is not palindrom but the String "())(" is.

                      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                      PHP.de Wissenssammlung | Kein Support per PN

                      Kommentar


                      • #12
                        Zitat von hausl Beitrag anzeigen
                        Nö, str_replace(), strtr(), ...
                        ^ This. Für ein einzelnes Zeichen würde ich niemals RegEx benutzen.
                        Zitat von derwunner
                        "Ein FISI ist auf gut-deutsch der Netzwerker. Das heißt Du gehst rauß zum Kunden oder auf die Straße und verlegst Leitungen" - derwunner 2015

                        Kommentar


                        • #13
                          Warum genau mache ich mir eigentlich die Mühe, NOCHMAL zu prüfen, ob Punkte drin sind, um NUR DIESE Strings zu bearbeiten?
                          Wenn die Strings keine Punkte enthalten, ändert sich doch eh nichts daran ...
                          Da kann ich die "Bearbeitung" also auch über alle Strings laufen lassen.
                          PHP-Code:
                          $var[$i] = str_replace(".",":",$var[$i]); 
                          Danke für den Hinweis mit dem str_replace()

                          Kommentar

                          Lädt...
                          X