PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   Regex für ein Namensfeld (http://www.selfphp.de/forum/showthread.php?t=24689)

urvater 05.07.2012 02:15:44

Regex für ein Namensfeld
 
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
PHP-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
Zitat:

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 11:19:56

AW: Regex für ein Namensfeld
 
Hast Du es mal mit escapen (\.) versucht!?

urvater 05.07.2012 19:23:08

AW: Regex für ein Namensfeld
 
Zitat:

Zitat von vt1816 (Beitrag 143446)
Hast Du es mal mit escapen (\.) versucht!?

Nein. Hab es aber gleich mal getestet. Klang auch logisch.

Pattern: '/[^a-z üÜäAöÖß-/.]/i' bringt
Zitat:

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:
PHP-Code:

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 14:00:22

AW: Regex für ein Namensfeld
 
Hi,

Zitat:

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
Zitat:

... 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 16:08:50

AW: Regex für ein Namensfeld
 
PHP-Code:

<?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 13:56:10

AW: Regex für ein Namensfeld
 
Zitat:

Zitat von Xor (Beitrag 143451)
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.


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:26:41 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.