Ankündigung

Einklappen
Keine Ankündigung bisher.

mit preg_match alle üblichen Namenszeichen matchen

Einklappen

Neue Werbung 2019

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

  • mit preg_match alle üblichen Namenszeichen matchen

    Hallo!

    Ich bin gerade dabei, einen Regex zu basteln, der alle üblichen Buchstaben, die hierzulande in einem Namen vorkommen, zulässt und gleichzeitig alle anderen ausschließt. Erlaubt sollen alle Zeichen sein, die im Normalfall auch in einem staatlichen Melderegister eingetragen werden, da die Daten auch nur von solchen Menschen eingetragen werden. Also chinesische, arabische Schriftzeichen und andere, sowie Sonderzeichen jeglicher Art - ausgenommen namenstypische (zB Bindestrich, Abstand) - sollen ausgeschlossen werden.

    Bisher bin ich so weit gekommen:
    PHP-Code:
    ^[A--žß]+(( |\-)[A--žß]+)*$ 
    Ich habe den Regex mit einer Namensliste von Ca 200 Facebook-Usern (inkl. Namen wie "Živković" oder "Çimen") getestet und alle wurden gematched. Ausserdem habe ich verschiedene Kombinationen mit Sonderzeichen getestet, die alle wie gewünscht gematched bzw aussortiert wurden.

    Jetzt möchte ich noch den Rat der Weisen bezüglich Anregungen und Kritik befragen. Ich bin für jeden Beitrag dankbar
    .

  • #2
    Wie spricht man eigentlich [^_^] aus?

    Versuchs besser mal mit Modifier u (unicode) und \pL statt [A-zÀ-žß].

    http://php.net/manual/de/regexp.reference.unicode.php

    Kommentar


    • #3
      Gute Frage Danke für den Tipp!
      .

      Kommentar


      • #4
        Zitat von kremser Beitrag anzeigen
        alle üblichen Buchstaben [...] im Normalfall auch in einem staatlichen Melderegister eingetragen werden
        "üblich" und "Normalfall" sind viel zu schwammig, um einen regulären Ausdruck zu formulieren.

        Wie der Name schon sagt, kann man mit einem regulären Ausdruck regelmäßige Sprachen prüfen. Diese sind vor allem dadurch gekennzeichnet, dass sie fest definierten Regeln folgen.

        Sprich: Ohne eine erschöpfende Liste an erlaubten und nicht erlaubten Zeichen, ist dieses Unterfangen sinnlos.
        [URL="http://goo.gl/6Biyf"]Lerne Grundlagen[/URL] | [URL="http://sscce.org/"]Schreibe gute Beispiele[/URL] | [URL="http://goo.gl/f2jR7"]PDO > mysqli > mysql[/URL] | [URL="http://goo.gl/jvfSZ"]Versuch nicht, das Rad neu zu erfinden[/URL] | [URL="http://goo.gl/T2PU5"]Warum $foo[bar] böse ist[/URL] | [URL="http://goo.gl/rrfzO"]SQL Injections[/URL] | [URL="http://goo.gl/Q81WJ"]Hashes sind keine Verschlüsselungen![/URL] | [URL="http://goo.gl/2x0e2"]Dein E-Mail Regex ist falsch[/URL]

        Kommentar


        • #5
          Die Anforderung ist nicht ganz klar. Živković ist kein deutscher Name. Die Frage ist was du als zulässig ansiehst und was nicht. Im Vietnamesischen werden beispielsweise lateinische Buchstaben verwendet und dann Diakritika u.ä. hinzugefügt, die du aber nicht unterstützt. Tschechische, Polnische und weitere Namen unterstützt du aber.

          Edit: Apo bringt es theoretisch auf den Punkt.

          Kommentar


          • #6
            Ich habe es doch definiert:

            ...alle üblichen Buchstaben, die hierzulande in einem Namen vorkommen...
            Erlaubt sollen alle Zeichen sein, die im Normalfall auch in einem staatlichen Melderegister eingetragen werden
            Es wird nicht auf "deutschen Namen" , sondern auf in Deutschland/Österreich verwendete Namen abgestellt.

            Wenn ein Chinese in China zB "#*+$" heisst, steht im Melderegister hier in Deutschland/Österreich auch nicht der originäre Name in chinesischen Schriftzeichen, sondern zB "Lai Xin".

            Kommt jedoch jemand aus dem Ausland und ist sein Name zB "Živković", wird dieser 1:1 so ins Melderegister eingetragen.

            Und diese "Sonderbuchstaben" will ich eben zulassen.
            .

            Kommentar


            • #7
              Nein, "üblich" ist keine Definition. Frag bei den zuständigen Behörden nach, nach welchen Regeln diese Namen eintragen. Ich kenne genug Leute, insbesondere aus der Balkangegend die ihrer Hatscheks beraubt wurden, während andere es behielten bzw. behalten durften. Bei anderen Schriftsystemen kommt dann zusätzlich die Latinisierung des Namens hinzu, die sich auch nicht immer an offizielle Standards hält. Ein Chinese mit einem in Wade-Giles latinisiertem Namen könnte also problemlos ein Apostroph im Namen haben.

              Kurz: Wie gesagt, wenns keine Liste mit erlaubten Zeichen gibt (entweder von dir oder der Behörde für die du das entwirfst) siehts da düster aus.

              Kommentar


              • #8
                Zitat von kremser Beitrag anzeigen
                Ich habe es doch definiert:

                ...alle üblichen Buchstaben, die hierzulande in einem Namen vorkommen...

                Erlaubt sollen alle Zeichen sein, die im Normalfall auch in einem staatlichen Melderegister eingetragen werden
                Das ist keine ausreichend exakte Definition. Was ist "üblich"? Wie definierst du das? Bauchgefühl?

                Woher weißt DU überhaupt, was in Melderegistern eingetragen wird und was nicht? Hast du Quellen? Wenn ja - dann halte dich doch einfach exakt an diese Quellen.

                Wenn dein Regex so passt, dann ist es doch in Ordnung für einen Anwendungsfall. Offensichtlich hast du ausreichend getestet und erfüllst deine Anforderungen damit.

                Formal ist am Regex nichts falsch. Inhaltlich? Das bezweifle ich.
                [URL="http://goo.gl/6Biyf"]Lerne Grundlagen[/URL] | [URL="http://sscce.org/"]Schreibe gute Beispiele[/URL] | [URL="http://goo.gl/f2jR7"]PDO > mysqli > mysql[/URL] | [URL="http://goo.gl/jvfSZ"]Versuch nicht, das Rad neu zu erfinden[/URL] | [URL="http://goo.gl/T2PU5"]Warum $foo[bar] böse ist[/URL] | [URL="http://goo.gl/rrfzO"]SQL Injections[/URL] | [URL="http://goo.gl/Q81WJ"]Hashes sind keine Verschlüsselungen![/URL] | [URL="http://goo.gl/2x0e2"]Dein E-Mail Regex ist falsch[/URL]

                Kommentar


                • #9
                  So, hab mal kurz nachgeschaut. Für Österreich gilt offenbar dafür Personenstandsgesetz §38. "Zusätzlich" muss das zuständige Amt den Namen akzeptieren, daher rührt wohl die unterschiedliche Behandlung von Buchstaben mit Diakritika, Hatschek, etc.

                  Kommentar


                  • #10
                    Naja, mit

                    Sind in der Urkunde andere als lateinische Schriftzeichen verwendet worden, müssen die Regeln für die Transliteration beachtet werden.
                    kann man jetzt auch nicht wirklich was anfangen. Was für Transliterationsregeln sind das denn im Detail?
                    [URL="http://goo.gl/6Biyf"]Lerne Grundlagen[/URL] | [URL="http://sscce.org/"]Schreibe gute Beispiele[/URL] | [URL="http://goo.gl/f2jR7"]PDO > mysqli > mysql[/URL] | [URL="http://goo.gl/jvfSZ"]Versuch nicht, das Rad neu zu erfinden[/URL] | [URL="http://goo.gl/T2PU5"]Warum $foo[bar] böse ist[/URL] | [URL="http://goo.gl/rrfzO"]SQL Injections[/URL] | [URL="http://goo.gl/Q81WJ"]Hashes sind keine Verschlüsselungen![/URL] | [URL="http://goo.gl/2x0e2"]Dein E-Mail Regex ist falsch[/URL]

                    Kommentar


                    • #11
                      Kann dir da nicht mehr sagen als da steht.
                      Ich denke in der Praxis ist eben eher das Akzeptieren der Behörde bzw. des zuständigen Mitarbeiters dafür verantwortlich. In einigen (asiatischen) Ländern wird die offizielle Umschrift ja oft gewechselt. Taiwan ist in diesem Jahrtausend glaub ich schon bei Nummer 3.

                      Kommentar


                      • #12
                        Wofür sind die Namen, welche hier validiert werden sollen?
                        Vor einiger Zeit lief hier mal eine längere Diskussion (Hab den Link leider nicht gefunden) dazu.
                        Das Résumé: Namen sowenig wie möglich einschränken. Auch bestimmte Sonderzeichen zulassen, wie den Punkt (Beispiel: "Dr. Hu's").
                        Ich benutze:
                        Code:
                        /^[^\W0-9_][^@§$%?~#=<>+\r\n]{1,60}$/u
                        LG jspit

                        Kommentar


                        • #13
                          Es sind Kundendaten für eine Art Webshop. Es sind aber nur Kunden aus Österreich vorgesehen, da es sich um ein Tool für Warenimporte nach Österreich handelt.

                          Ich teste gerade mit

                          PHP-Code:
                            $regex '/(?=^(\p{Ll}|\p{Lu})+(( |\-|\')(\p{Ll}|\p{Lu})+)*$)(?=^[\p{Latin} \-\']+$)/u'
                          (Danke an erc!)

                          Sonderzeichen, die keine Buchstaben sind habe ich eingeschränkt auf Bindestrich und Apostroph. Der Punkt deshalb nicht, weil der Name in voller Länge geschrieben werden soll.


                          Çimen
                          Bear
                          B.ar
                          B. ar
                          Bear-Bear GEe
                          [^_^]
                          O'Connor
                          O,Connor
                          陳方 安生
                          test, test
                          毛泽东
                          anti-âmes
                          Mauß
                          Schütz
                          Büşrâ
                          Živković
                          ups>up
                          ups^up
                          upsˇup
                          Guðmundsdóttir
                          Carreño Quiñones
                          Николаевич
                          Quiñones
                          Nguyễn Dũng
                          東海林賢蔵
                          Քրիստոնէութեան
                          .

                          Kommentar


                          • #14
                            Der Ausdruck erlaubt alle Zeichen aus dem Latin-Script von Unicode, für die „ist Großbuchstabe“ oder „ist Kleinbuchstabe“ erfüllt ist, sowie die Zeichen [ .-].

                            - http://en.wikipedia.org/wiki/Latin_script_in_Unicode

                            Eine ungewöhnlichere Kombination, die diese Definition erfüllt: "ꜴꝓĦɆ"

                            Du kannst anhand der verlinkten Liste der Bestandteile des Scripts vielleicht noch genauer definieren, was du willst.

                            Ansonsten schützt so was eben auch generell nicht vor Eingaben wie „Diesername Istfake“. Da stellt sich immer die Frage, welches Problem man damit lösen möchte.

                            (Die Frage meine ich weniger rhetorisch, als sie vielleicht klingt. Zeichen und Zeichensätze und Kodierungen sind in meinen Augen etwas, das wir (PHP-)Entwickler viel zu ungenau handhaben. Den Sweet Spot zwischen den Extremen "[A-Za-z]" und "\p{L}" empfinde ich als zu wenig erschlossen. Das ist irgendwie oft so: „Wird schon schiefgehen.“)

                            Kommentar


                            • #15
                              Danke für die Liste und den Hinweis!

                              In Casu werden Fake-Namen spätestens bei der Daten-Nachkontrolle mittels amtlichem Lichtbildausweis entlarvt. Das scriptmäßig zu prüfen, wäre niemals möglich.

                              Ich will die Daten-Eingabemöglichkeiten so genau wie möglich regeln - so viel wie nötig zulassen - so viel wie möglich ausschließen, daher versuche ich das hier.

                              A-Z reicht hier definitiv nicht aus und \p{L} greift ohne Zweifel zu weit für mein Vorhaben.

                              Aber mit obigem Regex kommt man schon ganz nah an das Ergebnis, das ich will.

                              Die Latin-Listen werde ich mir noch ansehen, mermshaus
                              .

                              Kommentar

                              Lädt...
                              X