Ingo: Sonderzeichen für Formularfelder

Hallo Leute,

habe bei den zugelassenen Sonderzeichen für Formularfelder ein Problem.
Ich wollte ein Hochkomma für Angaben von GPS-Daten zulassen, doch leider wird diese als Parse Error behandelt.
Meine frage kann mir Jemand sagen wie ich dieses Hochkomma behandeln muß ?

if(!eregi('^([a-zA-Z0-9 |°|.|']{3,20})$', $GPS))

Danke
für Hilfe.

  1. habe bei den zugelassenen Sonderzeichen für Formularfelder ein Problem.
    Ich wollte ein Hochkomma für Angaben von GPS-Daten zulassen, doch leider wird diese als Parse Error behandelt.

    '^([a-zA-Z0-9 |°|.|']{3,20})$'

    Du kannst ein Anführungszeichen nicht in einer Zeichenkette benutzen, wenn du diese Zeichenkette mit eben diesen Anführungszeichen begrenzt. Woher soll der Parser unter diesen Umständen wissen, wo deine Zeichenkette aufhört?

    Entweder benutzt du andere Anführungszeichen ("'") oder du maskierst das Anführungszeichen in der Zeichenkette (''').

    1. Hallo Gonzo,

      danke für deine Ausführung, leuchtet mir auch ein, habe leider keine Ahnung wie das "maskierst das Anführungszeichen in der Zeichenkette (''')" aussehen müßte in diese speziellen Zeile " '^([a-zA-Z0-9 |°|.|']{3,20})$' " wäre dankbar für deine Hilfe.

      Ingo

      1. habe leider keine Ahnung wie das "maskierst das Anführungszeichen in der Zeichenkette (''')" aussehen müßte in diese speziellen Zeile " '^([a-zA-Z0-9 |°|.|']{3,20})$' "

        Du hast zwei Lösungsmöglichkeiten für dein Problem:

        a) '^([a-zA-Z0-9 |°|.|']{3,20})$'
        b) "^([a-zA-Z0-9 |°|.|']{3,20})$"

        Mir würde b) eher zusagen, weil das Muster bzw. die Zeichenkette dann im Original im Code steht, d.h. ohne Maske.

        Das Ganze gehört zu den PHP-Grundlagen, erklärt im Kapitel über  Zeichenketten.

        Dein Muster erscheint mir davon abgesehen etwas undeutlich, denn eine Kette von beispielsweise zwanzig ° ist doch sicher keine gültige Eingabe? Weiterhin hast du in [a-zA-Z0-9 |°|.|'] den senkrechten Strich dreimal eingetragen, [a-zA-Z0-9 |°.'] führt zum gleichen Ergebnis. Vermutlich bist du fälschlicherweise davon ausgegangen, dass in einer Zeichenklasse (eckigen Klammern) ein Oder zwischen einzelnen Zeichen erforderlich sein müsste, dem ist aber nicht so.

        1. habe leider keine Ahnung wie das "maskierst das Anführungszeichen in der Zeichenkette (''')" aussehen müßte in diese speziellen Zeile " '^([a-zA-Z0-9 |°|.|']{3,20})$' "

          Du hast zwei Lösungsmöglichkeiten für dein Problem:

          a) '^([a-zA-Z0-9 |°|.|']{3,20})$'
          b) "^([a-zA-Z0-9 |°|.|']{3,20})$"

          Mir würde b) eher zusagen, weil das Muster bzw. die Zeichenkette dann im Original im Code steht, d.h. ohne Maske.

          Das Ganze gehört zu den PHP-Grundlagen, erklärt im Kapitel über  Zeichenketten.

          Dein Muster erscheint mir davon abgesehen etwas undeutlich, denn eine Kette von beispielsweise zwanzig ° ist doch sicher keine gültige Eingabe? Weiterhin hast du in [a-zA-Z0-9 |°|.|'] den senkrechten Strich dreimal eingetragen, [a-zA-Z0-9 |°.'] führt zum gleichen Ergebnis. Vermutlich bist du fälschlicherweise davon ausgegangen, dass in einer Zeichenklasse (eckigen Klammern) ein Oder zwischen einzelnen Zeichen erforderlich sein müsste, dem ist aber nicht so.

          »»

          <<< Besten Dank Gonzo!

          Habe eine Zeile weiter ein Textfeld und wollte die Anzahl der Zeichen nicht begrenzen und daher habe ich den zweiten Wert in den geschweiften klammern weg gelassen und dann wird mir immer angezeit "Feld LADUNG ist leer oder enthält unerlaubte Zeichen!"

          if(!eregi("^([a-zA-Z0-9 |%|&|$|!|?|+|:|ä|ö|ü|-|à|è|ò|é|á|ó|ú|ù|.|(|)]{3,})$", $ladung))

          auch wenn ich einen hohen Wert(z.B.1000) eintrage kommt die Gleiche Meldung?

          kann man da nicht für unbegrenzt ein * einsetzen und wenn ja , dann wie und wo?

          Danke für lehrreiche Tipps.

          1. Hallo,

            ...
            Danke für lehrreiche Tipps.

            die werden dir aber auch gegeben, damit man du dich SELF damit beschäftigst.
            Kann doch nicht sein, dass du nochmal einen Ausdruck postest, ohne die bisherigen Antworten anzuwenden :(

            http://de.selfhtml.org/javascript/objekte/regexp.htm hier findet man etwas über Reguläre Ausdrücke, und in der Liste findest du die Zeichen die auch in PHP maskiert werden müssen ...

            Gruß plan_B

            --
                 *®*´¯`·.¸¸.·
            1. Hallo,

              ...
              Danke für lehrreiche Tipps.

              die werden dir aber auch gegeben, damit man du dich SELF damit beschäftigst.
              Kann doch nicht sein, dass du nochmal einen Ausdruck postest, ohne die bisherigen Antworten anzuwenden :(

              http://de.selfhtml.org/javascript/objekte/regexp.htm hier findet man etwas über Reguläre Ausdrücke, und in der Liste findest du die Zeichen die auch in PHP maskiert werden müssen ...

              Gruß plan_B

              Hallo plan_B,

              genau Du bist von der Sorte die Anfängern unheimlich weiter, auch Dir sei Dank!!!
              Und wohl habe ich mich bei Gonzo für seine Hilfe bedankt und wenn richtih hinschaust habe seine Tipps angewendet indem ich die Hochkomma mit Gänsefüschen ersetzt habe!

              SORRY, aber hilf lieber keinem mit deinem E=mc²

              1. die werden dir aber auch gegeben, damit man du dich SELF damit beschäftigst.
                Kann doch nicht sein, dass du nochmal einen Ausdruck postest, ohne die bisherigen Antworten anzuwenden :(

                SORRY, aber hilf lieber keinem mit deinem E=mc²

                Nana, immer schön ruhig mit den wilden Pferden. Worauf plan_b hinauswollte, war, dass ich schrieb

                in einer Zeichenklasse (eckigen Klammern) ein Oder zwischen einzelnen Zeichen erforderlich sein müsste, dem ist aber nicht so.

                und du gleich darauf ein Muster präsentiert hast, indem du genau diesen Fehler wieder machst:

                ^([a-zA-Z0-9 |%|&|$|!|?|+|:|ä|ö|ü|-|à|è|ò|é|á|ó|ú|ù|.|(|)]{3,})$

                Nochmal, die senkrechten Striche, die andernorts für ein Oder stehen, sind in der in eckigen Klammern stehenden Zeichenliste nicht nötig.
                Obendrein machst du den Fehler, den Bindestrich falsch zu setzen. Wenn er als Zeichen Bindestrich erscheinen soll, muss er als letztes Zeichen in der Liste kommen, andernorts steht er für von/bis (wie in a-z = alle Buchstaben von a bis z).

                [a-zA-Z0-9 %&$!?+:äöüàèòéáóúù.()-]

                passt auf genau ein Zeichen aus der in den eckigen Klammern gegebenen Liste, einschließlich des Bindestrichs, jedoch ohne senkrechtem Strich - da wusste ich nicht, ob du den haben willst oder nur als (falsches) Oder benutzt hast.

                plan_b hatte (indirekt) schon darauf hingewiesen, befasse dich mal intensiv mit http://de.selfhtml.org/perl/sprache/regexpr.htm#zeichen.
                Ich täte dir davon abgesehen dringend raten, die PCRE-Funktionen (preg_match() & Co) zu verwenden; ich möchte behaupten, dass die diesen Funktionen zu Grunde liegende Bibliothek weiter verbreitet ist und bessere Funktionalität bietet. Eine umfangreichere Anleitung als besagte SELFHTML-Seite findest du unter http://de.php.net/manual/de/reference.pcre.pattern.syntax.php, wenn auch auf Englisch.

                Warum dieses Muster nun überhaupt nicht passt, kann ich nur vermuten, es sieht mit Ausnahme der Binde- und senkrechten Striche fehlerfrei aus. Eventuell liegt es an unterschiedlichen oder unerwarteten Kodierungen. Sendet der Browser beispielsweise in utf-8, geht der Vergleich in die Hose, weil bei utf-8 mehrere Bytes pro Zeichen jenseits US-ASCII auftreten, womit eregi() aber nicht rechnet, diese Funktion geht von konstant einem Byte aus.
                Möglicherweise ist dein PHP-Skript auch einfach nur anders kodiert als die vom Browser kommenden Daten, wenn der Browser den Bytewert 12 für ein ä sendet und in deinem Skript ist das ä als Bytewert 234 gespeichert, wird das auch nichts.
                Probiere es erstmal nur mit [1]{3,}$ . Funktioniert's dann, ist die Zeichenkodierung Schuld.

                Schau auch in das Fehlerprotokoll des Servers, vielleicht ist ja doch etwas am Muster verkehrt.

                auch wenn ich einen hohen Wert(z.B.1000) eintrage kommt die Gleiche Meldung?

                Dann kann es definitiv nicht an der geschweiften Klammer liegen.

                kann man da nicht für unbegrenzt ein * einsetzen

                * steht für beliebig viele, du möchtest aber wohl mindestens drei haben, insofern fällt das Sternchen weg. Und in einer geschweiften Klammer hat das Sternchen eh nix zu suchen, da kommen nur Zahlen oder gar nichts rein; * ist eine kürzere Schreibweise für {0,} .

                und wenn ja , dann wie und wo?

                Steht oder stünde in besagter Anleitung.


                1. a-zA-Z0-9 %&|$!?+:.()- ↩︎