Espressione regolare per verifica password

  • Creatore Discussione Creatore Discussione andreto
  • Data di inizio Data di inizio

andreto

Utente Attivo
5 Dic 2012
88
0
0
Ciao a tutti,
da giorni sto impazzendo :incazz2: per creare un'espressione regolare da inserire in preg_match che mi riesca a verificare una password con queste caratteristiche:

minimo 8 caratteri
minimo 2 lettere minuscole (anche non consecutive)
minimo 2 lettere maiuscole (anche non consecutive)
minimo 2 numeri (anche non consecutivi)

Sono riuscito a fare qualcosa ma l'accetta solo se i caratteri da verificare sono consecutivi e in ordine come nell'espressione.

Ho provato a cercare in rete ma ho trovato solo minino 8 caratteri, 1 lettera e 1 numero ma non 2.

Attendo con ansia un vostro aiuto

Ciao e grazie a tutti :byebye:
 
Io avevo trovato questo:

PHP:
((?=.*[0-9])(?=.*[a-zA-Z]).{8,})

Che verifica se la password inserita è lunga almeno 8 caratteri e contiene almeno 1 lettera e almeno 1 numero.

A me servirebbe:

Verifica se la password inserita è lunga almeno 8 caratteri e contiene almeno 2 lettere e almeno 2 numeri.

Non so se si può creare un'espressione nuova, modificare quella o se non si può proprio fare con le espressioni regolari.
Se si può fare mi piacerebbe sapere come per approfondire il mio studio :o

Nel frattempo mi sono divertito a creare qualcosa che svolga circa lo stesso compito:

1)
PHP:
$numero = $maiuscole = $minuscole = 0; 
for($i = 1; $i <= strlen($pass); $i++){ 
$carattere = substr($pass, $i-1, 1); 
$ascii = ord($carattere); 
if ($ascii >= 48 && $ascii <= 57) $numero++; 
if ($ascii >= 65 && $ascii <= 90) $maiuscole++; 
if ($ascii >= 97 && $ascii <= 122) $minuscole++; 
} 
echo 'Numeri: '.$numero."</br>"; 
echo 'Maiuscole: '.$maiuscole."</br>"; 
echo 'Minuscole: '.$minuscole;

2)
PHP:
for($i = 48; $i <= 57; $i++){ 
$numer += substr_count($pass,chr($i)); 
} 
for($i = 65; $i <= 90; $i++){ 
$maiuscol += substr_count($pass,chr($i)); 
} 
for($i = 97; $i <= 122; $i++){ 
$minuscol += substr_count($pass,chr($i)); 
} 
echo 'Numeri: '.$numer."</br>"; 
echo 'Maiuscole: '.$maiuscol."</br>"; 
echo 'Minuscole: '.$minuscol;

3)
PHP:
$num = $mai = $min = 0; 
foreach (count_chars($pass, 1) as $i => $val){ 
if($i >= 48 && $i <= 57) $num += $val; 
if($i >= 65 && $i <= 90) $mai += $val; 
if($i >= 97 && $i <= 122) $min += $val; 
} 
echo 'Numeri: '.$num."</br>"; 
echo 'Maiuscole: '.$mai."</br>"; 
echo 'Minuscole: '.$min;

4)
PHP:
$nume = $maiu = $minu = 0; 
$num = "0123456789"; 
$mai = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
$min = "abcdefghijklmnopqrstuvwxyz"; 
for($a = 1; $a <= strlen($pass); $a++){ 
$caratterepass = substr($pass, $a-1, 1); 
for($b = 1; $b <= strlen($num); $b++){ 
$caratterenum = substr($num, $b-1, 1); 
if($caratterepass == $caratterenum) $nume++; 
} 
for($c = 1; $c <= strlen($mai); $c++){ 
$caratteremai = substr($mai, $c-1, 1); 
if($caratterepass == $caratteremai) $maiu++; 
} 
for($d = 1; $d <= strlen($min); $d++){ 
$caratteremin = substr($min, $d-1, 1); 
if($caratterepass == $caratteremin) $minu++; 
} 
} 
echo 'Numeri: '.$nume."</br>"; 
echo 'Maiuscole: '.$maiu."</br>"; 
echo 'Minuscole: '.$minu;

Se non posso usare le RegEx, mi piacerebbe sapere quale di queste sarebbe meglio :byebye:
 
ciao
dai un occhio a questo
eventalmente provalo
PHP:
<?php
/*
minimo 8 caratteri (e un massimo ?)
minimo 2 lettere minuscole (anche non consecutive)
minimo 2 lettere maiuscole (anche non consecutive)
minimo 2 numeri (anche non consecutivi)

se vuoi che la password sia solo alfanumerica a-zA_Z0-9 prima ti conviene pulirla
*/
function pulisci_pass($p){
	$pulita="";
	for($k=0; $k < strlen($p);$k++){
		if(($p[$k] >="a" && $p[$k] <="z") || ($p[$k] >="A" && $p[$k] <="Z") || ($p[$k] >="0" && $p[$k] <="9")){
			$pulita .= $p[$k];//ricostruisco con solo alfanumerici
		}
	}
	return $pulita;
}


function verifica_pass($p){
	$p=pulisci_pass($p);//questa se non ti serve la elimini o la commenti
	//verifico per prima cosa la lunghezza
	$lun=strlen($p);
	if($lun < 8){//se anche massimo es. ($lun < 8 || $lun > 16)
		return FALSE;
	}else{
		$min=0; $mai=0; $num=0;
		for($k=0; $k < $lun;$k++){
			if($p[$k] >="a" && $p[$k] <="z"){
				$min ++;
			}elseif($p[$k] >="A" && $p[$k] <="Z"){
				$mai ++;
			}elseif($p[$k] >="0" && $p[$k] <="9"){
				$num ++;
			}
		}
		if($min < 2 || $mai < 2 || $num < 2){
			return FALSE;
		}else{
			return $p;
		}
	}
}
//**test********
$pass="Fo8b5Hkk";
$pass_c=verifica_pass($pass);
if($pass_c){
	echo "la password $pass_c è corretta<br />";
}else{
	echo "la password $pass NON è corretta<br />";
}
$pass="Fo8*5Hkk";
$pass_c=verifica_pass($pass);
if($pass_c){
	echo "la password $pass_c è corretta<br />";
}else{
	echo "la password $pass NON è corretta<br />";
}
?>
 

Discussioni simili