Suchmuster - Zeichenreihenfolge

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

  • Suchmuster - Zeichenreihenfolge

    Ich beschäftige mich gerade mit Suchmustern für ein Formular und bin dabei auf folgende Eigenart gestoßen, für die ich keine Erklärung habe:
    Folgende Abfrage funktioniert:
    Code:
    if (!preg_match("/^[a-zA-ZäÄüÜöÖß0-9-.].*[a-zA-ZäÄüÜöÖß0-9-.]+$/", $_POST["strasse"])){ 
        $message4a="<span class='message'>Bitte nur Buchstaben</span><br>";
    		}
    nimmt man jedoch die 0-9 aus dem Suchmuster , bewirkt der Punkt innerhalb der eckigen Klammer, dass die Abfrage nicht mehr funktioniert. Wechselt man die Reihenfolge von Bindestrich und Punkt funktioniert es wieder.
    Funktioniert nicht:
    Code:
    [a-zA-ZäÄüÜöÖß-.]
    Funktioniert:
    Code:
    [a-zA-ZäÄüÜöÖß.-]
    Aber warum? Müsste die Reihenfolge der erlaubten Zeichen innerhalb einer Charakterklasse nicht eigentlich egal sein oder welche Faktoren spielen da noch eine Rolle. Würde mich freuen, falls Ihr eine Erklärung habt.

  • #2
    . steht für jedes beliebige Zeichen. Also dein Code lässt alle Zeichen zu. Wenn du Punkt als Zeichen verwenden willst, musst du es escapen.

    Kommentar


    • #3
      Danke, habe jetzt \ eingefügt, aber witziger Weise bleibt es auch dann dabei, dass die Reihenfolge von Punkt und Bindestrich eine Rolle spielt.

      Funktioniert:

      Code:
      [a-zA-ZäÄüÜöÖß\.-]
      Funktioniert nicht:
      Code:
      [a-zA-ZäÄüÜöÖß-\.]
      Warum

      Kommentar


      • #4
        Hallo,

        was h3ll sagt, trifft auf Zeichenklassen natürlich nicht zu, aber der Bindestrich hat dort eine Sonderbedeutung. Wenn du 0-9 schreibst, verwendest du ihn, um einen Bereich abzudecken. Mit ß-. ist das dasselbe, nur das der Bereich ungültig ist (weil . schon weit vor ß kommt). Du musst in Zeichenklassen also den Bindestrich escapen, nicht den Punkt, wenn du wirlich einen Bindestrich meinst.

        Gruß,

        Amica
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Danke Amica, jetzt klappt es. Wußte noch nicht, dass der Bindestrich eine Sonderbedeutung hat, auch wenn er nicht zwischen 0-9 steht. Vielen Dank Euch beiden, habe wieder was dazugelernt.

          Viele Grüße Jona

          Kommentar


          • #6
            @h3ll: aus dem Manual: "Dot has no special meaning in a character class."

            @Jona: $_POST['strasse'] = 'aaa' führt zur Meldung "bitte nur Buchstaben"
            Wieso soll ein Strassennahme eigentlich nur aus Buchstaben bestehen bzw. was meinst du in diesem Zusammenhang mit "Buchstaben"? Wie gefällt die "Strasse des 17. Juni"?

            Kommentar


            • #7
              Wer reguläre Ausdrücke verwenden möchte, um Buchstaben zu erkennen, ist gut beraten, den UTF-8-Modus einzuschalten und dann die passende Unicode-Character-Class zu verwenden. Also etwa so:

              PHP-Code:
              // Buchstaben groß und klein
              preg_match('/\A\pl+\z/u'$input);

              // Straßennamen (Vorschlag)
              preg_match('/\A[\pl+0-9-\s]+\z/u'$input); 
              Das erlaubt immer noch, Unsinn einzugeben, aber ich kenne keine vorgeschriebene Mindest-Länge für Straßennamen ...


              Zitat von onemorenerd Beitrag anzeigen
              ...

              Wieso soll ein Strassennahme eigentlich nur aus Buchstaben bestehen bzw. was meinst du in diesem Zusammenhang mit "Buchstaben"? Wie gefällt die "Strasse des 17. Juni"?
              Ja, und Leerzeichen sollen auch in Straßennamen öfter vorkommen, als man denkt. Auch in Deutschland soll es Straßen geben, die nach Leuten benannt wurden, deren Namen bspw. lustige französische Buchstaben mit Akzent beinhalten. Dann wären da noch die nationalen Minderheiten, die auch gerne vom bekannten lateinischen Alphabet abweichende Buchstaben benutzen.

              Vorsorglich möchte ich auch darauf hinweisen, dass Hausnummern nicht nur aus Ziffern bestehen müssen.
              Zuletzt geändert von fireweasel; 03.02.2011, 12:19.
              Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

              Kommentar

              Lädt...
              X