PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Regex für ein Namensfeld


urvater
05.07.2012, 01:15:44
Grundlage: Es handelt sich um ein lokales Projekt. Somit würde eigentlich eine Prüfung auf ein leeres Feld reichen. Allerdings kenne ich meine Pappenheimer und möchte in einer Formularauswertung zumindest verhindern, dass absoluter Müll erfasst wird.
Asiatische oder kyrillische Sonderzeichen kann und will ich ausschliessen.

Mein Code

//$ansprechpartner ist das entsprechende Formularfeld, welches einen Namen beinhaltet
if(!preg_match('/[^a-z üÜäAöÖß-]/i', $ansprechpartner)){
$this->setAnsprechpartner($ansprechpartner);
} else {
$this->setErrorMsg('Es wurden ungültige Zeichen im Namen verwendet.');
}

Soweit funktioniert alles auch wie gewüscht.

Einziges Problem: Dr. oder Hr. bzw. Fr. ruft setErrorMsg auf, da der Punkt nicht im preg_match vorkommen darf.

Erweitere ich das Pattern um den Punkt(einfach einen . hinter - gesetzt), bekomme ich eine Fehlermeldung
Warning: preg_match() [function.preg-match]: Compilation failed: range out of order in character class at offset 20 in C:\xampp\htdocs\echtbetrieb\application\model\wartung\validform.php on line 51

Ich gebe zu. Regexp sind für mich bömische Dörfer.
Kann mir jemand helfen den Punkt im String doch noch zu erlauben?

vt1816
05.07.2012, 10:19:56
Hast Du es mal mit escapen (\.) versucht!?

urvater
05.07.2012, 18:23:08
Hast Du es mal mit escapen (\.) versucht!?
Nein. Hab es aber gleich mal getestet. Klang auch logisch.

Pattern: '/[^a-z üÜäAöÖß-/.]/i' bringt
Warning: preg_match() [function.preg-match]: Unknown modifier '.' in C:\xampp\htdocs\echtbetrieb\application\model\wartung\validform.php on line 95


Pattern: '/[^a-z üÜäAöÖß-\.]/i' bringt die ursprüngliche Fehlermeldung.

ABER: '/[^a-z \.üÜäAöÖß-]/i' führt zum gewollten Ergebnis.

Offenbar mag es preg_match nicht, wenn ein Punkt am Ende steht. Wird am Ende vermutlich nicht als Suchzeichen sondern anderweitig interpretiert.
Wäre somit nur noch interessant, wieso es nicht am Ende stehen darf.

Der Vollständigkeitshalber:
if(!preg_match('/[^a-z \.üÜäAöÖß-]/i', $ansprechpartner)){
$this->setAnsprechPartner($ansprechpartner);
} else {
$this->setErrorMsg('Ungültige Zeichen im Namen<br />');
}
Führt die Methode setAnsprechPartner() aus, wenn nur die im Suchmuster verwendeten Zeichen im String enthalten sind. Das Suchmuster sollte auf KEINEN Fall verwendet werden, wenn man andere Namen erwarten muss als sie in Deutschland üblich sind.
Grieschische, französische und andere Sprachen mit Sonderzeichen im Namen würden einen Fehler werfen.
Der Bindestrich dient der Behandlung von Doppelnamen und der Punkt lediglich um Titel bzw. das Geschlecht mit reinschreiben zu können.
Letzteres würde ich bei einem wichtigeren Formular eher mit einem extra Formularfeld umsetzen.

Xor
06.07.2012, 13:00:22
Hi,

Offenbar mag es preg_match nicht, wenn ein Punkt am Ende steht. Wird am Ende vermutlich nicht als Suchzeichen sondern anderweitig interpretiert.

Glaube das nicht ganz. Denke eher, dass ihm dein "ß-\." am Ende, speziell das "-" gestört hat.
Zumindest würde es erklären warum zu beginn "a-z" => "a bis z" entspricht, allerdings "ß bis ." keinen Sinn macht. Auch deine Fehlermeldung ... Compilation failed: range out of order in character class ... würde dazu passen.

Um einen Bindestrich auch zu erlauben/verbieten solltest du ihn vielleicht auch escapen ("\-"), bin mir aber nicht sicher ob es notwendig ist.

Lg

misterunknown
12.07.2012, 15:08:50
<?php
$string = "Fr. Dr. Hubert";

if(preg_match('/[^a-zA-Z\süÜäAöÖß\-\.]/i', $string)){
echo ("Fehler");}
else{ echo("Korrekt.");}

?>

Logik: WENN ein Zeichen in dem String ist, was NICHT reingehört, gebe einen Fehler aus. Ansonsten ist der String korrekt.

Beachte, dass ich vor dem preg_match das ! weggelassen habe.

meikel (†)
14.07.2012, 12:56:10
bin mir aber nicht sicher ob es notwendig ist.
Na klar muß das so sein. - hat in Zeichenklassen die "von bis" Funktion. Und wenn man nur das Zeichen möchte, muß man es escapen.