2016-07-19 3 views
0

Ich möchte überprüfen, ob mein String diesen Regeln entspricht?Wie kann ich überprüfen, ob eine Zeichenfolge etwas enthält oder nicht?

  • mindestens 6 Zeichen
  • maximal 40 Zeichen
  • es beide Ziffern und Buchstaben enthalten

Ich glaube, ich habe nach vorne schauen zu verwenden. Also hier ist, was ich versucht habe, so weit:

if (preg_match($string, "/^((?!=[0-9]{1,})(?!=[a-zA-Z]{1,})){6,40}$/")) { 
    // following 
} else { 
    // not following 
} 

Aber mein Muster doesn't work correctly. Wie kann ich es reparieren?

+0

Warum verwenden Sie einen negativen Lookahead? –

+0

@AnshulRai Keine funktioniert nicht .. * negative/positive Lookahead * –

+0

Ihre 'preg_match' ist invertiert, Regex sollte zuerst sein. Ist dies für die Passwort-Validierung? – chris85

Antwort

2

Warum einen komplizierten regulären Ausdruck erstellen, wenn Sie möchten, für die Bedingungen nur testen kann?

function isValid($string) { 
    return strlen($string) >= 6 && 
      strlen($string) <= 40 && 
      preg_match("/\d/", $string) && 
      preg_match("/[a-zA-Z]/", $string); 
} 

// Negative test cases 
assert(!isValid("hello")); 
assert(!isValid("2shrt")); 
assert(!isValid("This one is way 2 long! This one is way 2 long! This one is way 2 long!")); 
assert(!isValid("abcdef")); 
assert(!isValid("123456")); 

// Positive test cases 
assert(isValid("abcde2")); 
assert(isValid("12345a")); 
+0

Scheint gut. thx +1 –

1

Sie brauchen möglicherweise nicht so viel Regex dafür, es kann es übermäßig komplizieren.

Ich würde dies einen Versuch:

if(strlen($string) >= 6 && strlen($string) <= 40 && preg_match("/[a-z]/i", $string) && preg_match("/[0-9]/", $string)) { 
    //Matches rules 
else { 
    //Doesn't match 
} 
+0

Ihr Muster stimmt nicht mit diesem '53test' überein. Weil in diesem Beispiel die Ziffer zuerst steht. –

+0

@MartinAJ hat es behoben. – ComputerLocus

+0

Keine Notwendigkeit für das '+' in der zweiten Regex. – smarx

1

, wenn Sie es egal, was im Spiel ist, und wenn Sie nur für die Bedingungen überprüfen möchten ... Sie könnten versuchen, dieses

^(?=)([0-9]|[a-zA-Z]){6,40}$

^ - starting with 
?= - followed by 
{6,40} - length 
$ - end 

EDIT: In Bezug auf die Kommentare hier ist die modifizierte Regex:

^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]){6,40}$

Erklärung:

`?=` Positive Lookahead match any character followed by 0-9 OR 
`?=` Positive Lookahead match any character followed by a-z or A-Z 
`([a-zA-Z0-9])` Followed by anything in numbers or letters 
`{6,40}` length between 6,40 

EDIT 2

Nach weiteren Kommentare sollten diese Regex:

^(?=.*[0-9])(?=.*[a-zA-Z])(.*){6,40}$ etwas wie !a1234! oder -aquy67!

+0

Ihr Muster entspricht einer Zeichenfolge ohne jede Ziffer https://regex101.com/r/cX0mB4/4 –

+1

Oder eine Zeichenfolge mit nur Ziffern. – smarx

+0

Ich glaube das würde "abc123 !!!" ablehnen. Sie sollten wahrscheinlich '.' Anstelle von '[a-zA-Z0-9]' verwenden. – smarx

-1
if (preg_match($string, "/^[\d\w]{6,40}$/")) { 
    // following 
} else { 
    // not following 
} 
+1

Ich glaube, "111111" würde Ihren Test hier bestehen. – smarx

+0

Sie sollten eine Erklärung hinzufügen. Auch '\ w' ist mehr als' a-zA-Z' und '0-9' .. – chris85

+0

Bitte bearbeiten Sie mit mehr Informationen. Code-only und "try this" Antworten werden abgeraten, da sie keine durchsuchbaren Inhalte enthalten und nicht erklären, warum jemand "das versuchen sollte". – abarisone

1

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.

+0

Nice ... thx +1 –

+0

Danke @MartinAJ - Ich benutze immer noch PHP mehr als ich möchte, aber habe viele Idiome aus anderen Programmiersprachen angenommen, wenn ich so tun, dass mein Code lesbarer und wiederverwendbar ist, und so dass es leichter zusammen komponiert wird. Ich denke, dass PHP-Code im Allgemeinen davon profitieren kann, eher wie idiomatischer Ruby geschrieben zu werden, indem man kleine, knappe Funktionen verwendet, die in Komposition oder in Ketten nacheinander aufgerufen werden, besonders wenn man eine gute IDE und/oder einen Debugger hat, um den Werten zu folgen von Funktion zu Funktion. –

Verwandte Themen