Steffi84: Reguläre Ausdrücke in PHP, wer kann helfen?

Guten Abend,

folgender Code beschäftigt mich derzeit:

$checkname = "[$§;{}?|#()'+*@^~]";
if(eregi($checkname, $_POST['name']))
{
   echo 'Fehler';
}

Ich versuche, bzw. will versuchen aus einem Wort alle möglichen Sonderzeichen zu filtern. Das klappt auch schon ganz gut, nur wie bekomme ich da jetzt Sonderzeichen wie [] oder auch den . rein? Das sind ja alles zeichen die eig. für die Funktion selber stehen... die [] zum beispiel oder auch mit dem . kann man ja arbeiten. Weiß jemand von euch wie man das am besten umsetzen kann. Darüber hinaus: Wüsste jemand welche Sonderzeichen ich noch filtern könnte? Die Funktion soll einen Vornamen überprüfen.

--
Eure Steffi
  1. Servus,

    Weiß jemand von euch wie man das am besten umsetzen kann.

    Die beste Möglichkeit ist generell, nicht auszuschließen was du nicht willst, sondern nur zuzulassen was du willst. Das ist nicht nur "sicherer", sondern idR auch übersichtlicher.

    Also für einen Namen beispielsweise nur [A-Za-z]+ (plus etwaige Sonderzeichen, die du in Namen zulassen möchtest, wie z.B. é).

    Gruss
    Patrick

    --
    sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
    1. Weiß jemand von euch wie man das am besten umsetzen kann.
      Die beste Möglichkeit ist generell, nicht auszuschließen was du nicht willst, sondern nur zuzulassen was du willst. Das ist nicht nur "sicherer", sondern idR auch übersichtlicher.

      Also für einen Namen beispielsweise nur [A-Za-z]+ (plus etwaige Sonderzeichen, die du in Namen zulassen möchtest, wie z.B. é).

      und was macht dann eine "Anna-Lena" oder ein "Böckmann"? ein "Çetin"? Es gibt zu viele zeichen als das man sie aufzählen könnte, wenn doch dann sag mir wie :-)

      --
      Eure Steffi
      1. Huhu

        und was macht dann eine "Anna-Lena" oder ein "Böckmann"? ein "Çetin"? Es gibt zu viele zeichen als das man sie aufzählen könnte, wenn doch dann sag mir wie :-)

        Da anscheinend die Namen von ihren Trägern selbst eingetragen werden sollen:
        Warum willst Du da etwas validieren?

        Seinen eigenen Namen wird man doch richtig schreiben können und wer das nicht will schreibt eh irgend einen Käse in das Formular.

        Viele Grüße

        lulu

        --
        bythewaythewebsuxgoofflineandenjoytheday
        1. Seinen eigenen Namen wird man doch richtig schreiben können und wer das nicht will schreibt eh irgend einen Käse in das Formular.

          Darum gehts ja ... der OP will ja den Käse nicht in seinem Projekt haben ...

          Grüße
          Erik

          1. Servus,

            [...] der OP [...]

            Wo wirs grad von Namen haben, Steffi ist in allen mir bekannten Sprachen weiblich ;)

            will ja den Käse nicht in seinem Projekt haben ...

            Siehe dazu mein Posting.

            Gruss
            Patrick

            --
            sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
            1. gudn tach!

              [...] der OP [...]
              Wo wirs grad von Namen haben, Steffi ist in allen mir bekannten Sprachen weiblich ;)

              generische bezeichnungsweise.

              prost
              seth

              1. Servus,

                generische bezeichnungsweise.

                Wobei es hier allerdings um eine konkrete Person geht, deren Geschlecht eindeutig spezifiziert ist.
                Ansonsten hast du natürliche Recht, ich halte ebensowenig von Leser(-innen) eines/-r Forum(-in)sjf0hosdjfksdj;kljm(-in) :D

                Gruss
                Patrick

                --
                sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
                1. gudn tach!

                  generische bezeichnungsweise.
                  Wobei es hier allerdings um eine konkrete Person geht, deren Geschlecht eindeutig spezifiziert ist.

                  schon. aber sein geschlecht war im kontext egal, weshalb man auch ruhig auf die generische bezeichnung (hier maskulinum) zurueckgreifen kann.

                  [...] ich halte ebensowenig von Leser(-innen) eines/-r Forum(-in)sjf0hosdjfksdj;kljm(-in) :D

                  lol!

                  prost
                  seth

                  1. gudn tach!

                    generische bezeichnungsweise.

                    Wobei es hier allerdings um eine konkrete Person geht, deren Geschlecht eindeutig spezifiziert ist.

                    schon. aber sein geschlecht war im kontext egal [...]

                    "_ihr_"! "_ihr_" geschlecht! _die_ person!

                    oh mann, seth, du bist so doof. ;-)

                    prost
                    seth

                    1. Servus,

                      "_ihr_"! "_ihr_" geschlecht! _die_ person!

                      Siehste :P

                      Gruss
                      Patrick

                      --
                      sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
                  2. Hallo seth,

                    schon. aber sein geschlecht war im kontext egal, weshalb man auch ruhig auf die generische bezeichnung (hier maskulinum) zurueckgreifen kann.

                    Nein, das generische Maskulinum hat nichts damit zu tun, ob das Geschlecht einer Person im Kontext relevant ist.

                    Schöne Grüße,

                    Johannes

                    1. gudn tach!

                      schon. aber sein geschlecht war im kontext egal, weshalb man auch ruhig auf die generische bezeichnung (hier maskulinum) zurueckgreifen kann.

                      Nein, das generische Maskulinum hat nichts damit zu tun, ob das Geschlecht einer Person im Kontext relevant ist.

                      generische bezeichnung - "eine bezeichnung, die alle umfasst"

                      waere das sexus im kontext relevant gewesen, haette man auch auf die -in-Form zurueckgreifen sollen. klar, oder man haette den begriff mit einem attribut versehen muessen. zwar ist "OP" dann erstmal generisch, aber die bezeichnung "weiblicher OP" ueberhaupt nicht und eben die meinte ich.

                      also z.b.
                      "die Original-Posterin will ja den Käse nicht in ihrem Projekt haben."

                      oder
                      "der weibliche OP will ja den Käse nicht in seinem Projekt haben."

                      da du was anderes verstandest als ich meinte, haben wir afais beide recht. ich hatte mich so ausgedrueckt, dass man es auch so wie du haette verstehen koennen.

                      prost
                      seth

      2. Servus,

        und was macht dann eine "Anna-Lena" oder ein "Böckmann"? ein "Çetin"?

        Wie gesagt, weitere Sonderzeichen wie - oder Umlaute lassen sich ja noch problemlos mit aufnehmen. Wenn du nun wirklich alle auf der ganzen Welt in Namen vorkommende Zeichen berücksichtigen willst, wirst du mit "meiner" Methode natürlich scheitern.

        Die Frage ist dann, macht es Sinn, alle diese Zeichen zuzulassen? (Für einen Benutzernamen würde es z.B. in der Regel keinen Sinn machen).
        Wenn ja, (zur reinen Datenerfassung; Anschrift, etc.) fragt sich widerum, ob es überhaupt Sinn macht, den Namen auf Sonderzeichen zu prüfen (außer der üblichen Maskierung zur Verhinderung von Command Injections, versteht sich). Denn wenn jemand für seinen Namen wirklich Mist angeben will, reichen ihm auch die 26 Buchstaben des Alphabets ("Dfbdgfksdfgksdgjfsdgf" ist wahrscheinlich in keiner Sprache ein gültiger Name).

        Um deine ursprüngliche Frage dennoch zu beantworten:
        Zeichen mit Sonderfunktion maskiert man einfach mit einem "" (Backslash), wobei es auf den Kontext ankommt. Genaueres dazu findest du im PHP Manual zur <http://de.php.net/manual/en/reference.pcre.pattern.syntax.php@Pattern Syntax> (ich bin mal so frei und schieb dir gleich preg* unter ;).

        Gruss
        Patrick

        --
        sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
        1. Pattern Syntax

          --
          sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
        2. Erst einmal danke für eure ganzen postings, das war echt schonmal sehr gutes feedback für mich.

          Ein teil von euch hat höchst wahrscheinlich recht. wozu prüfen? es gibt so viele buchstaben und in einem multi kulti land wie deutschland kommt auch sicher so einiges vor.

          shn schrieb eben:

          (außer der üblichen Maskierung zur Verhinderung von Command Injections, versteht sich)

          wie würde das aussehen, wenn ich die von euch empfohlene preg funktion benutzen würde? sry aber reguläre ausdrücke sind echt nicht meine stärke auch nicht nach seitenweise voller infos davon... bin quasi am verzweifeln :-/

          --
          Eure Steffi
          1. Servus,

            wie würde das aussehen, wenn ich die von euch empfohlene preg funktion benutzen würde?

            Dafür brauchst du garkein Regex, dafür gibt es in PHP vordefinierte Funktionen. Zu den Begriffen SQL Injection und Cross Site Scripting (XSS) dürfte sich so einiges im Netz finden lassen. Habe gerade leider keine passenden Links zur Hand.

            Gruss
            Patrick

            --
            sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
    2. Servus,

      ich vergaß zu erwähnen, dass in den meisten Fällen die Perl-kompatiblen Funktionen (preg_*) ereg* vorzuziehen sind. Sie sind zum einen (meist) schneller und bieten eine doch um einiges erweiterte Syntax.

      Gruss
      Patrick

      --
      sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
  2. gudn tach!

    $checkname = "[$§;{}?|#()'+*@^~]";
    [...] wie bekomme ich da jetzt Sonderzeichen wie [] oder auch den . rein?

    durch maskieren mit einem back-slash.

    $checkname = '[$§;{}?|#()'+*@^~[]]';

    ich weiss nicht ob posix (eregi) auch so toll ist wie perl (in php preg_match), jedenfalls ist das back-slash vor [ eigentlich ueberfluessig, also

    $checkname = '[$§;{}?|#()'+*@^~[]]';

    Das sind ja alles zeichen die eig. für die Funktion selber stehen... die [] zum beispiel oder auch mit dem . kann man ja arbeiten.

    der punkt hat in zeichenklassen-definitionen, also innerhalb von box brackets seine literale bedeutung, braucht also auch nicht maskiert zu werden.

    $checkname = '[$§;{}?|#()'+*@^~[].]';

    Weiß jemand von euch wie man das am besten umsetzen kann. Darüber hinaus: Wüsste jemand welche Sonderzeichen ich noch filtern könnte?

    einfacher waer's evtl., wenn du bloss angibst, was erlaubt sein soll

    z.b. $checkname = '[1]+$';

    ^ anfang
    [...]+ mindestens eines dieser zeichen
    $ ende

    Die Funktion soll einen Vornamen überprüfen.

    oh, das kann man beliebig kompliziert gestalten.
    am einfachsten ist es, wenn du nur lateinische buchstaben und evtl. das minus (als bindestrich) zulaesst. das hat sogar gewisse praktische vorteile.

    ansonsten koennte evtl. das hier interessant sein, also
      \p{L}
    wenn ich es richtig verstehe.
    evtl. reicht dir aber auch schon "\w" und eine passende locale-einstellung.

    prost
    seth


    1. a-zA-Z- ↩︎