Debe pensarse mas en la "presencia" que en la "posibilidad", suena extraño, lo sé.
Los rangos implican posibilidad mas no presencia, pues al ser un conjunto opcional no hay nada que indique obligatoriedad.
Una forma de controlar la presencia es usando grupos para mirar hacia atrás/adelante, es decir, así:
Código PHP:
Ver original$test = array('ferTTTgege544454ee', 'ferrTTTTTTTTTTTTT'); $regex = '/^(?:.*(?=[A-Z]).*(?=[a-z]).*(?=[0-9]).*|.*(?=[a-z]).*(?=[0-9]).*(?=[A-Z]).*|.*(?=[0-9]).*(?=[A-Z]).*(?=[a-z]).*|.*(?=[a-z]).*(?=[A-Z]).*(?=[0-9]).*)$/';
foreach ($test as $one) {
echo "=> $one PASS!\n";
}
}
A
grosso modo únicamente estoy comparando las permutas de dichos rangos, no es limpio, ni la mejor expresión que se me ocurre, pero al menos resuelve el problema.
Básicamente es un serie de sentencias como "cualquier cosa seguida de [...]", etc.