ERLEDIGT
NEIN
NEIN
ANTWORTEN
4
4
ZUGRIFFE
837
837
EMPFEHLEN
-
20.07.04 14:42 #1
- Registriert seit
- May 2004
- Ort
- Berlin
- Beiträge
- 14
Hallo,
folgendes Problem kann ich auch trotz konzentrierten Durchlesens der php.net Pattern Syntax Informationen und des php/QuakeNet Tutorials nicht zufriedenstellend lösen:
Ich möchte die Daten überprüfen, die ich von meinen Usern per Formular übermittelt bekomme. Dabei sollen nur reguläre Vor- und Zunamen, bzw. ein einzelnes Wort als Namen akzeptiert werden. Dafür habe ich diese Richtlinien aufgestellt:- Der erste Buchstabe des ersten Wortes muss groß geschrieben sein.
- Danach müsen mindestens zwei kleine Buchstaben folgen.
- Jetzt darf ein Leerzeichen erscheinen, worauf aber wieder ein Großbuchstabe folgen muss.
- Nach einem zweiten Großbuchstaben müssen wieder mindestens zwei Kleinbuchstaben folgen.
- Es darf nur maximal ein Leerzeichen enthalten sein.
- Der letzte Buchstabe muss klein sein.
- Die Minimallänge bei einem Wort beträgt drei und die maximale Länge 40 Buchstaben. Bei zwei Wörtern beträgt die minimale Länge sieben (zweimal drei plus Leerzeichen) und die maximale Länge 40 Zeichen.
Das Ganze soll per preg_match überprüft werden.
Diese Befehlszeile stellt zumindest sicher, dass der erste Buchstabe groß geschrieben wurde. Sie läßt aber leider beliebig viele Leerzeichen zu und nach einem Leerzeichen darf auch klein weiter geschrieben werden. Die Maximallänge von 40 Buchstaben kann auch überschritten werden.PHP-Code:if (!preg_match("/^[A-Z]{1}[a-z]{2,39}[ ]{0,1}/", $_POST['username'])) {
Ich hoffe unter Euch befindet sich ein Experte, der mir weiterhelfen kann. Nach acht Stunden Grübeln über eine einzige Befehlszeile verzweifel ich langsam.
Liebe Grüße, Sandra
-
Versuchs mal so:
....das eigentliche Problem ist dabei die Gesamtlänge...da man im zweiten Wort(falls vorhanden)...nicht ermitteln kann, wie lang das erste Wort ist.Code :1
if(!preg_match("/^[A-Z][a-z]{2,}(|\s[A-Z][a-z]{2,})$/",preg_replace("/^.{41,}$/",':o(',trim($_POST['username']))))
Deshalb wird vor der Überprüfung, falls der gesamte username länger als 40 Zeichen ist, selbiger durch :o(ersetzt
...was ihn dann von vornherein ungültig macht.(das könnte man natürlich auch vorher per strlen() prüfen....und in dem entsprechenden Eingabefeld per maxlength sicherstellen)
Du solltest allerdings in Betracht ziehen, dass es auch Namen mit Umlauten und Bindestrichen gibt....welche momentan nicht möglich sind.
-
So in der Art...
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
$username = $_POST["username"]; $username = preg_replace("#\040{2,}#", " ", $username); // Mehrfache Leerzeichen ersetzen. if (strlen($username) > 40) { $error[] = "Der Username ist zu lang."; } $words = explode(" ", $username); if (count($words) > 2) { $error[] = "Der Username enthält zu viele Wörter."; } for($i = 0; $i < count($words); $i++) { if (!preg_match("#[A-Z][a-z]{2, 40}#", $username)) { $error[] = "Der Username ist ungültig aufgebaut."; } } if (count($error) > 0) { die(implode("<br />\n", $error)); }Im Ruhestand.
-
20.07.04 16:47 #4
- Registriert seit
- May 2004
- Ort
- Berlin
- Beiträge
- 14
Danke fatalus und Johannes,
ich habe meinen Code jetzt nach Euren Tips verbessert:
(edit Sandra: es steht noch ein \ vor dem s im regex, das wird aber nicht angezeigt)PHP-Code:trim($_POST['username']);
if (strlen($_POST['username'] > 40)) {
die ('Ihr User-Name darf nicht mehr als 40 Zeichen lang sein.');
}
if (!preg_match("/^[A-Z][a-z]{2,}(|\s[A-Z][a-z]{2,})$/", $_POST['username'])) {
die ('Bitte benutzen Sie nur User-Namen gemäß unseren Richtlinien');
}
Das funktioniert jetzt fehlerfrei. Jedes Wort muss groß geschrieben sein. Nur ein Space usw.
Ich stimme Dir mit dem Bindestrich zu, fatalus. Wenn dann sollte der aber nur in der Mitte von Wörtern zu finden sein. Bekomme ich das noch in mein regex integriert oder müßte ich es wieder vorab prüfen mit Hilfe eines weiteren preg_match Befehls? Der Code sollte nicht zu rechenintensiv werden, dann würde ich lieber auf den Bindestrich verzichten.
Liebe Grüße, Sandra.Geändert von Sandra Haupt (20.07.04 um 16:50 Uhr)
-
Über die Belastung würd ich mir keine Sorgen machen...das sollte der Rechner schon schaffen

Das könnte so aussehen:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14
<?php if(isset($_POST['username'])) { if (strlen(trim($_POST['username'] ))> 40) { die ('Ihr User-Name darf nicht mehr als 40 Zeichen lang sein.'); } if (!preg_match("/^[A-ZÄÖÜ][a-zäöüß]{2,}(|-[A-ZÄÖÜ][a-zäöüß]{2,})(|\s[A-ZÄÖÜ][a-zäöüß]{2,}(|-[A-ZÄÖÜ][a-zäöüß]{2,}))$/",trim($_POST['username']))) { die ('Bitte benutzen Sie nur User-Namen gemäß unseren Richtlinien'); } } ?>
...das würde in Vor-und Zuname jeweils einen Bindestrich erlauben(Umlaute nunmehr auch....und das ß...vielleicht will sich ja mal der Kanzler anmelden
)
Nach dem Bindestrich muss wiederum ein Grossbuchstabe und mindestens 2 Kleinbuchstaben kommen.....a'la Hans-Hubert Müller-Wohlfahrt
P.S.:wenn du reguläre Ausdrücke postest, dann benutze statt den PHP-Tags lieber die Code-Tags, dann verschwinden die Backslashes nachher nicht
Ähnliche Themen
-
Mittels Regex Gültigkeit einer anderen Regex prüfen
Von blade runner im Forum PHPAntworten: 8Letzter Beitrag: 25.06.10, 12:07 -
URL prüfen mit Regex
Von HerbertJ im Forum PHPAntworten: 3Letzter Beitrag: 22.12.09, 11:42 -
Tokens auf regex prüfen
Von hispeedsurfer im Forum JavaAntworten: 10Letzter Beitrag: 29.11.06, 09:01 -
Variable Feldermenge mit if + Regex prüfen ?!
Von Sebigf im Forum PHPAntworten: 0Letzter Beitrag: 01.08.06, 02:22 -
problem bei $_POST['zuname'], variable ist plötzlich leer
Von KITT22 im Forum PHPAntworten: 1Letzter Beitrag: 22.08.05, 13:18





Zitieren
Login






[PHP] [Codeschnipsel] ImageColor aus HTML-Farbcodierung erstellen