Ehrlich gesagt ist der beste Weg, um dies in PHP zu umgehen, kein Regulärer Ausdruck. PHP hat eine Reihe von "ctype" -Methoden (docs here), die in die Sprache eingebaut sind, damit Sie Zeichentypen bestimmen können, und diese Methoden sind viel einfacher für so etwas wie Regex zu verwenden. Versteh mich nicht falsch Regex ist ein großartiges und mächtiges Werkzeug, aber es ist viel zu komplex für dieses Problem. Auch wenn Sie später meine Lösung mit regex für komplexes Musterabgleich erweitern müssen, können Sie sie einfach für die spezifischen Bedürfnisse hinzufügen, die Sie haben, und Sie müssen sie nicht verwenden, um Zeichentypen zu bestimmen.
Ich würde ernsthaft empfehlen, dass Sie eine Reihe sehr kleiner Funktionen/Methoden schreiben, die Sie dann zusammensetzen können, um zu überprüfen, ob die zu überprüfende Zeichenkette alle Kriterien erfüllt (Sie können das Beispiel in eine Datei einfügen) und auf der Befehlszeile ausführen, um die Ausgabe des Skripts unter der Klassendefinition zu sehen):
<?php
/* Example written assuming that these methods are all
* part of a Class, hence the access declarations etc.
* If you want to write them as a function library that
* would work fine too
*/
class InputValidation {
const MIN_LENGTH = 6;
const MAX_LENGTH = 40;
public function isLongerThanMinLength($text) {
$len = strlen($text);
if ($len > self::MIN_LENGTH) {
return TRUE;
} else {
return FALSE;
}
}
public function isShorterThanMaxLength($text) {
$len = strlen($text);
if ($len <= self::MAX_LENGTH) {
return TRUE;
} else {
return FALSE;
}
}
public function hasAlphaAndDigitChars($text) {
if (ctype_alpha($text) || ctype_digit($text)) {
return FALSE;
} else {
if (ctype_alnum($text)) {
return TRUE;
} else {
return FALSE;
}
}
}
public function validInput($text) {
if (!$this->isLongerThanMinLength($text)) {
return FALSE;
}
if (!$this->isShorterThanMaxLength($text)) {
return FALSE;
}
if (!$this->hasAlphaAndDigitChars($text)) {
return FALSE;
}
return TRUE;
}
}
$inst = new InputValidation;
$test1 = "Hello"; // too short
$test2 = "pneumonoultramicroscopicsilicovolcanoconiosis"; // too long
$test3 = "pneumonoultramicroscopicsil1covolcanocon"; // right length and includes at least one number
$test4 = "123456789123456789"; // right length, but no alphabet chars
$test5 = "HelloMyName"; // right length, but no numeric chars
$test6 = "Hello My Name"; // right length, but has whitespace
$test7 = "Hello^My%Name1"; // right length, but has 'special' chars
print "\n";
var_dump($inst->validInput($test1));
print "\n";
var_dump($inst->validInput($test2));
print "\n";
var_dump($inst->validInput($test3));
print "\n";
var_dump($inst->validInput($test4));
print "\n";
var_dump($inst->validInput($test5));
print "\n";
var_dump($inst->validInput($test6));
print "\n";
var_dump($inst->validInput($test7));
print "\n";
print "\n";
exit();
?>
auf diese Weise können Sie verschiedene Validierungsmethoden verwenden, um die Komplexität dieser Validierung zu erhöhen oder neue Validierungen erstellen, indem Sie zusammen setzen die vorhandenen Regeln auf andere Weise oder fügen Sie einfach neue Regeln hinzu, indem Sie neue kurze Methoden hinzufügen.
Warum verwenden Sie einen negativen Lookahead? –
@AnshulRai Keine funktioniert nicht .. * negative/positive Lookahead * –
Ihre 'preg_match' ist invertiert, Regex sollte zuerst sein. Ist dies für die Passwort-Validierung? – chris85