Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] RegEx mit Variabler länge

Einklappen

Neue Werbung 2019

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

  • [Erledigt] RegEx mit Variabler länge

    Hi,
    ich will, dass die Länge varible ist:
    Zeile 23:
    PHP-Code:
    preg_match("/^[a-z]{$this->minimaleVornamenLaenge$this->maximaleNachnamenLaenge}$/i"$_POST['vorname']) 
    Die Meldung ist:

    Code:
    Parse error: syntax error, unexpected ',', expecting '}' in C:\xampp\htdocs\scripte\kontaktformular.php on line 23
    Wenn ich anstatt den Variablen Zahlen einsetzte geht es:
    PHP-Code:
    preg_match("/^[a-z]{3, 20}$/i"$_POST['vorname']) 
    Hintergrund:

    Man soll einstellen können wie Lang bzw. Kurz der Name sein muss und es dürfen nur Buchstaben von a-z vorhanden sein.

    Natürlich sind andere Lösungswege auch erwünscht .

    LG Sonic


  • #2
    Du musst es in ZWEI Schritten machen... erst das Pattern zusammenstellen, dann matchen.. viele Sachen haben in einem regulären Ausdruck spezielle Bedeutung (z.B.Dollarzeichen, Klammern, Plus und Minus, etc.)
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Hi,
      danke für die Antwort.
      Meinst du so:
      PHP-Code:
      $pattern "/^[a-z]{$this->minimaleVornamenLaenge$this->maximaleVornamenLaenge}$/i";
                  if (
      preg_match($pattern$_POST['vorname'])) {//Mit RegExp wird geprüft, ob die Syntak stimmt 
      Es kommt aber immer noch die gleiche Meldung..

      LG Sonic

      Kommentar


      • #4
        Ok,
        habs so gehts:
        PHP-Code:
        preg_match('/^[a-z]{'.$this->minimaleVornamenLaenge.', '.$this->maximaleVornamenLaenge.'}$/i'$_POST['vorname']) 

        Kommentar


        • #5
          So, jetzt zeig uns mal die Stelle, wo zwei Variablen gleichzeitig benutzt werden: PHP: Strings - Manual
          Du hjast nicht mal die Fehlermeldung verstanden, denn es ist ein Parse error, kein Fehler im Ausdruck.
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Hi,

            also so geht es bei mir ohne Fehlermeldung:

            PHP-Code:
            if (preg_match('/^[a-z]{'.$this->minimaleVornamenLaenge.', '.$this->maximaleVornamenLaenge.'}$/i'$_POST['vorname'])) {//Mit RegExp wird geprüft, ob die Syntak stimmt
                            
            $vornamenZeichenCheck true;
                        }else{
                            
            $vornamenZeichenCheck false;
                        } 
            Aber vll. hast du ja das Problem, oder ich deine Aussage nicht verstanden:

            Als ich anstatt der Variablen Zahlen hatte ging es noch. Aber ich habs jetzt ja gelöst. Das der Ausdruck richtig war hab ich ja gewusst, nur wie ich die Länge($this->minimaleVornamenLaenge) beeinflussen konnte eben nicht. Und bei ersten Versuch gabs nen Error.


            LG Sonic

            Kommentar


            • #7
              Zitat von Sonic Beitrag anzeigen
              Hi,

              also so geht es bei mir ohne Fehlermeldung:

              PHP-Code:
              if (preg_match('/^[a-z]{'.$this->minimaleVornamenLaenge.', '.$this->maximaleVornamenLaenge.'}$/i'$_POST['vorname'])) {//Mit RegExp wird geprüft, ob die Syntak stimmt
                              
              $vornamenZeichenCheck true;
                          }else{
                              
              $vornamenZeichenCheck false;
                          } 
              ...
              Wieso baust du die Ermittlung der String-Länge in den Regulären Ausdruck ein? Mit strlen() geht das unkomplizierter. Abgesehen davon muss der PCRE bei jedem preg_match()-Aufruf neu erzeugt werden. Damit hebelst du das interne Caching aus, dein Script wird langsamer und verbrät mehr Speicher. Falls $this->minimaleVornamenLaenge und sein Kumpel wirklich bei jedem Durchlauf einen anderen Wert haben sollten.

              PHP-Code:
              if (
                  (
              $len strlen($_POST['vorname'])) >= $this->minimaleVornamenLaenge 
                  
              && 
                  
              $len <= $this->maximaleVornamenLaenge
                  
              &&
                  
              preg_match('/\A[a-zA-Z]\z/')
              ) {
                 
              // hurray
              }
              else {
                 
              // Verd****e Sch...

              Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

              Kommentar


              • #8
                Hi,
                ist denn deine Lösung von der Performace her besser? Ich ermittle mit meinem Script, ob der Vorname nur aus Buchstaben von a-z besteht und er muss mindestens 3 Zeichen haben und maximal 20 Zeichen haben

                LG Sonic

                Kommentar


                • #9
                  Zitat von Sonic Beitrag anzeigen
                  und er muss 3 Zeichen kurz und 20 lang sein.
                  Ein Paradoxon
                  Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                  Kommentar


                  • #10
                    Ja ok. Mindestens 3 Zeichen und darf maximal 20 haben. Aber ich denke Ihr hab verstanden was ich gemeint hab

                    LG Sonic

                    Kommentar


                    • #11
                      Guter Punkt, fireweasel.

                      Er redet davon, dass es für reguläre Ausdrücke ein internes Caching gibt, so dass eine mehrfache Ausführung beschleunigt werden kann. Das gilt aber nur für gleiche Ausdrücke.

                      Was oben aber noch fehlt ist eine isset/Nullwert/Typprüfung vor allem anderen. Zudem würde ich den AUsdruck negiert anlegen:

                      PHP-Code:
                      if (=== preg_match ('/[^a-z]/i' $val)) .. 
                      Da reicht schon ein Treffer. Ob [^a-z] oder [^a-z]+ jetzt performanter wäre, kann ich ad hoc aber nicht sagen..
                      --

                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                      --

                      Kommentar


                      • #12
                        Hi,
                        also die Funktion sieht wiefolgt aus:
                        PHP-Code:
                        private function vornamenPruefen()
                            {
                                if(isset(
                        $_POST['token'])){
                                    
                                    if (
                        preg_match('/^[a-z]{'.$this->minimaleVornamenLaenge.', '.$this->maximaleVornamenLaenge.'}$/i'$_POST['vorname'])) {//Mit RegExp wird geprüft, ob die Syntak stimmt
                                       
                        $vornamenZeichenCheck true;
                                    }else{
                                        
                        $vornamenZeichenCheck false;
                                    }
                                    
                                    if(empty(
                        $_POST['vorname']) or !$vornamenZeichenCheck){
                                        return 
                        "<span class=\"KontaktFehlerMeldung\">Bitte geben Sie einen gültigen Vornamen an.</span>";//Wenn kein Name eingegeben wurde oder die Syntak nicht stimmt, wird eine Fehlermeldung ausgegeben. Wenn alles passt wird true zurückgeben
                                    
                        }
                                }
                            } 
                        @nikosch: Mit meinem RegEx hab ich jetzt sozusagen eine Whitelist. Wenn ich das negiert mache wird das dann nicht zu einer Blacklist. Oder habe ich dich falsch verstanden?

                        LG Sonic

                        Kommentar


                        • #13
                          Ok, mir ist gerade aufgefallen, dass:

                          José

                          nicht erlaubt ist. Gibt es denn ein Zeichen, dass z.B é oder

                          Kommentar


                          • #14
                            Zitat von Sonic Beitrag anzeigen
                            Ok, mir ist gerade aufgefallen, dass:

                            José

                            nicht erlaubt ist. Gibt es denn ein Zeichen, dass z.B é oder
                            Ach herrjeh ...

                            Ich wollte gerade anfangen die ctype-Funktionen zu empfehlen, und völlig auf Regular Expressions zu verzichten. Für a-zA-Z sind die in den allermeisten Fällen überdimensioniert. Aber nun ...

                            Ja es gibt was für é und alle seine kleinen und großen Verwandten. Das nennt sich Zeichenklassen. Für Buchstaben ("letter") in UTF-8 tuts '\p{L}' oder seine Negierung '\p{L}'. Ähnliches gibts auch für Codepages. Die mag ich aber nicht, also musst du dich selbst mit denen befassen.

                            Zitat von nikosch;
                            Was oben aber noch fehlt ist eine isset/Nullwert/Typprüfung vor allem anderen. ...
                            Genau, bevor man loslegt und Länge oder Inhalt mit den Vorgaben vergleicht, sollte erstmal was da sein zum Vergleichen.

                            Längen von Strings kann man in PHP auch mit isset() prüfen.
                            PHP-Code:
                            // unter der Voraussetzung, das $POST['token'] 
                            // ein String ist, was normalerweise der Fall sein sollte
                            function pruefen() {
                                
                            $vornamenZeichenCheck = (
                                    isset(
                            $_POST['token'][$this->minimaleVornamenLaenge]) &&
                                    !isset(
                            $_POST['token'][$this->maxmimaleVornamenLaenge 1]) &&
                                    
                            // die UTF-8-Version von '/[^a-z]/i'
                                    
                            !preg_match('/\P{L}/u'$_POST['token'])
                                );
                                
                            // ... und weiter im Text

                            Irgendwie gefällt mir das Ganze aber immer noch nicht. Dreimal $_POST['token'] abzufragen hat verschiedene Nachteile: Es muss an mehreren Stellen Code geändert werden, wenn "token" durch was anderes ersetzt wird.
                            Eine Funktion, die Eingaben prüft, würde ich nicht so speziell sondern allgemeiner aufbauen. Sicher gibts zu dem Vornamen noch 'nen Nachnamen, ein Password oder andere Angaben, die auch auf Inhalt und eventuell Länge geprüft werden sollen.

                            Zitat von Sonic;
                            Mit meinem RegEx hab ich jetzt sozusagen eine Whitelist. Wenn ich das negiert mache wird das dann nicht zu einer Blacklist. Oder habe ich dich falsch verstanden?
                            Da du auf das Vorhandensein einer Gruppe von Einzelzeichen prüfst, die entweder dazu- oder nicht dazugehören, ist das Ergebnis das gleiche: Entweder alle Zeichen der einen Gruppe oder der Rest. Da es keine weiteren Möglichkeiten gibt, kann dir nichts "durchschlüpfen", wie beim Black-Listing.
                            Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                            Kommentar


                            • #15
                              Hi,
                              danke für deine Antwort. Also ich mach grad ein Kontaktformular. Dort soll Vorname Nachname und die E-Mail geprüft werden. Ich habe eine Sicherheits funktion, die das mit dem Token regelt. Aber vll. ist einfacher euch das Script zu zeigen(Bei der Funktion Captcha bin ich gerade-> noch nicht fertig):
                              PHP-Code:
                              private function vornamenPruefen()
                                  {
                                      if(isset(
                              $_POST['token'])){
                                          
                                          if (
                              preg_match('/^[a-z]{'.$this->minimaleVornamenLaenge.', '.$this->maximaleVornamenLaenge.'}$/i'$_POST['vorname'])) {//Mit RegExp wird geprüft, ob die Syntak stimmt
                                             
                              $vornamenZeichenCheck true;
                                          }else{
                                              
                              $vornamenZeichenCheck false;
                                          }
                                          
                                          if(empty(
                              $_POST['vorname']) or !$vornamenZeichenCheck){
                                              return 
                              "<span class=\"KontaktFehlerMeldung\">Bitte geben Sie einen gültigen Vornamen an.</span>";//Wenn kein Name eingegeben wurde oder die Syntak nicht stimmt, wird eine Fehlermeldung ausgegeben. Wenn alles passt wird true zurückgeben
                                          
                              }
                                      }
                                  }
                                  
                                  private function 
                              nachnamenPruefen()
                                  {
                                      if(isset(
                              $_POST['token'])){
                                          if (
                              preg_match('/^[a-z]{'.$this->minimaleNachnamenLaenge.', '.$this->maximaleNachnamenLaenge.'}$/i'$_POST['nachname'])) {
                                              
                              $nachnamenZeichenCheck true;
                                          }else{
                                              
                              $nachnamenZeichenCheck false;
                                          }
                                          
                                          if(empty(
                              $_POST['nachname']) or !$nachnamenZeichenCheck){
                                              return 
                              "<span class=\"KontaktFehlerMeldung\">Bitte gib einen gültigen Nachnamen an.</span>";
                                          }
                                      }
                                  } 

                              Bitte nicht komplett auseinander nehmen. Hab mir viel Mühe gegeben

                              LG Sonic

                              Kommentar

                              Lädt...
                              X