Daniel1987: Frage zur funktion "ereg"

Hi@all,

habe ein Problem mit regulären ausdrücken! :-/ bisher wollte ich immer die gültigkeit mit namen so prüfen:

[code=php]if(!ereg('[1]+$',$_POST['vorname']) && !empty($_POST['vorname']))
{
$error['anmeldung']['vorname']['2'] = 'Der Vorname enthält ungültige Zeichen!<br />';
}[/code]

das war noch ein stück code von älteren programmen. Als ich mir dann überlegte das namen auch aus anderen zeichen bestehen könnten:

ö,Ö,ä,Ä,ü,Ü,ß,- (bei doppelnamen)

habe ich mir mal überlegt wie ich das dazu addieren könnte. ich habe zwar viel über diese funktion raus gefunden und auch wie sie funktioniert, aber ich weiß nicht wie ich sie ausbauchen kann. :-( bzw. was das "+$" bedeutet?

ich hoffe es kann mir einer von euch helfen.

--
lg dani

  1. a-zA-Z ↩︎

  1. Hi,

    habe ich mir mal überlegt wie ich das dazu addieren könnte. ich habe zwar viel über diese funktion raus gefunden und auch wie sie funktioniert, aber ich weiß nicht wie ich sie ausbauchen kann. :-( bzw. was das "+$" bedeutet?

    Es heißt gar nicht "+$". Das Pluszeichen ist ein so genannter Quantifier für Zeichen, Gruppe oder Konstrukt davor: [A-Za-z] heißt beliebiger Buchstabe, und [A-Za-z]+ heißt ein oder mehrere Buchstaben. Das Dollarzeichen steht dagegen für das String-Ende, genau wie ^ den Anfang bezeichnet. Der Gesamtausdruck [1]+$ heißt also, dass der String nur gültig ist, wenn er AUSSCHLIESSLICH Buchstaben enthält. [A-Za-z]+ ohne Anfangs- und Endmarkierung würde dagegen z.B. auch auf "17364!!!Hallo767===" oder so etwas passen, weil "Hallo" eben aus einem oder mehreren Buchstaben besteht und der Rest irrelevant ist.

    Ganz nebenbei: In Namen können schon ein paar mehr Zeichen vorkommen, so dass mir diese Art Test entschieden zu link wäre! Viele Leute haben noch ganz andere diakritische Zeichen im Namen, z.B. französische Akzentbuchstaben (René).

    Schöne Grüße
    Sascha


    1. a-zA-Z ↩︎

    1. Hmmm, ihr habt alle Recht, aber ich denke das mir keiner sagen kann welche buchstaben alle in namen vorkommen, oder? :-)

      --
      lg dani
      1. echo $begrüßung;

        Hmmm, ihr habt alle Recht, aber ich denke das mir keiner sagen kann welche buchstaben alle in namen vorkommen, oder? :-)

        Wenn du keine Einschränkungen angibst, welche Kulturkreise du berücksichtigen möchtest, ist das nahezu unmöglich. Je größer du den Kreis ziehst, desto mehr Zeichen kommen hinzu. Mal weniger (Akzente auf lateinischen Buchstaben) mal mehr (andere Schriftsysteme wie kyrillisch, arabisch, asiatische).

        Ebenso ist der Zeichenvorrat interessant, den du zu berücksichtigen gedenkst. Ein noch recht übersichtliches ISO 8859-1 mit (nur) 256 Zeichen, oder darf es die gesamte Unicode-Palette sein?

        Eine Whitelist der erlaubten Zeichen ist zwar sicherer als eine Blacklist, da du sicherlich nicht alle "bösen", auszuschließenden Zeichen kennst, aber bei Unicode nicht mehr praktisch anwendbar. Abhängig von der konkreten Aufgabenstellung würde ich mich auf den Ausschluss der Zeichen 0x00 bis 0x1F beschränken.

        echo "$verabschiedung $name";

        1. Hi dedlfix,

          könntest du mir sagen wie ich das am besten mache?

          --
          lg Daniel
          1. echo $begrüßung;

            könntest du mir sagen wie ich das am besten mache?

            Nicht wirklich, weil ich die konkrete Aufgabenstellung nicht kenne. Du bist auch nicht auf meine Anmerkungen eingegangen, so dass ich nicht weiß, was du bestmöglich machen möchtest. Wenn es sich um die Steuerzeichen handelt, so bilden die eine Zeichenklasse: [\x00-\x1F]

            echo "$verabschiedung $name";

            1. Wie würde das dann im zusammenhang mit der Funktion aussehen? Ich habe, bzw. wollte mir die Zeichen x00-\x1F angucken, die ich quasi ausklammern will aber diese Zeichen sind nicht vorhanden?

              --
              lg dani
              1. echo $begrüßung;

                Wie würde das dann im zusammenhang mit der Funktion aussehen? Ich habe, bzw. wollte mir die Zeichen x00-\x1F angucken, die ich quasi ausklammern will aber diese Zeichen sind nicht vorhanden?

                Diese Zeichen sind Steuerzeichen wie z.B. der Zeilenumbruch. Sie auszugeben hat verschiedene Wirkungen - z.B. eine neue Zeile anzufangen - die man gern vermeiden möchte, wenn man sie nicht explizit haben will. Das sind auch nur die wesentlichsten Zeichen, die man in einem Namen nicht haben möchte.

                Wenn du wirklich ereg() verwenden möchtest, müsstest du selbst in der Dokumentation nachlesen, wie man diese Zeichen dort notiert. Im Allgemeinen sollte man unter PHP die preg-Funktionen für reguläre Ausdrücke verwenden. Dafür war meine Notation bereits geeignet. Mehr kann ich dir nicht sagen, weil du auf wesentliche Teile meiner Fragen nicht eingehst.

                echo "$verabschiedung $name";

                1. ich würde ja gerne machen was du sagst aber wenn ich bei php.net "preg" eingebe dann kommen mehrere "preg" funktionen.

                  preg_grep
                  preg_match
                  preg_quote
                  preg_replace
                  preg_split

                  würde mir gerne alles dazu durchlesen, da mein englisch leider gottes nicht so mächtig ist, komme ich nicht weiter...!

                  --
                  lg dani
                  1. echo $begrüßung;

                    ich würde ja gerne machen was du sagst aber wenn ich bei php.net "preg" eingebe dann kommen mehrere "preg" funktionen.
                    würde mir gerne alles dazu durchlesen, da mein englisch leider gottes nicht so mächtig ist, komme ich nicht weiter...!

                    Da ich kein RegExp-Manual auf deutsch kenne, hier die Kurzform: Das Gegenstück zu ereg() heißt preg_match(). Die Parameterreihenfolge ist die gleiche. Der Haupt-Unterschied neben der teilweise anderen und vor allem auch umfangreicheren Syntax ist, dass das Suchmuster in zwei gleiche Zeichen einzurahmen ist. Der Schrägstrich wird hierfür gern genommen:

                    if (preg_match('/[\x00-\x1F]/', $_POST['vorname']))
                      // Der Vorname enthält (mindestens ein) Steuerzeichen

                    echo "$verabschiedung $name";

  2. Hallo Daniel1987,

    if(!ereg('[1]+$',$_POST['vorname']) && !empty($_POST['vorname']))

    {
    $error['anmeldung']['vorname']['2'] = 'Der Vorname enthält ungültige Zeichen!<br />';
    }

      
    ganz schlecht. Statt ereg lieber Perl-kompatible (& POSIX-konforme) und perfomancemäßig schnellere preg-unktionen nutzen. In diesem Fal also  
      
    if(!preg\_match("^[a-zA-Z]+$", ...) && ....)  
      
    
    > das war noch ein stück code von älteren programmen.  
      
    ziemlich alt, preg gabs schon zu den Zeiten, als ich mit PHP anfing bzw. noch PHP schrieb (und das war vor JAHREN).  
      
    
    > Als ich mir dann überlegte das namen auch aus anderen zeichen bestehen könnten:  
    > ö,Ö,ä,Ä,ü,Ü,ß,- (bei doppelnamen)  
    > habe ich mir mal überlegt wie ich das dazu addieren könnte. ich habe zwar viel über diese funktion raus gefunden und auch wie sie funktioniert, aber ich weiß nicht wie ich sie ausbauchen kann. :-( bzw. was das "+$" bedeutet?  
      
    Sowohl in der PHP-Dokumentation als auch an zahlreichen anderen Stellen, z.B. in SELFHTML im Kapitel Perl gibts eine Menge Erklärung zu Regulären Ausdrücken.  
      
    Ohne grundlegend anzufangen (siehe dort) erkläre ich dir kurz deinen Regex:  
      
    ^[a-zA-Z]+$ matcht auf einen String, der nur aus Buchstabenkombinationen im Bereich von kleinem a bis z oder großem A-Z besteht. Das sagt [a-zA-Z], das plus dahinter, dass min. eins von diesen Zeichen da sein muss, und das ^ und $, dass dies den gesamten String darstellen muss.  
      
    Entsprechend muss der Regex erweitert werden: ^[a-zA-ZöÖüÜäÄß-]+$  
    (ggf. Zeichensatzprobleme erwarten!)  
      
    Grüße,  
      
      Sven
    

    1. a-zA-Z ↩︎

  3. Hi,

    ö,Ö,ä,Ä,ü,Ü,ß,- (bei doppelnamen)

    das wird nicht langen, es soll ja auch Leute geben, die René oder Chèrie heissen. Ich denke, Du solltest lieber kritisch Zeichen ausschliessen. Gross und klein brauchst Du aber nicht zu unterscheiden, dafür gibts den Modifier "i" (hinter dem delimiter).

    habe ich mir mal überlegt wie ich das dazu addieren könnte.

    Grundsätzlich kannst Du eigene Klassen beliebig anlegen: [-_a-z0-9äöü]. Mir scheint, Dir fehlt ein wenig Lektüre ;-)

    bzw. was das "+$" bedeutet?

    Das Plus gehört zur vorherigen Klasse und bedeutet 1 oder mehrere. $ steht für das Stringende. Wie gesagt, lesen bildet...

    Gruesse, Joachim

    --
    Am Ende wird alles gut.