Regex PHP para validação de senha

Eu não estou obtendo o efeito desejado de um script. Eu quero que a senha contenha caracteres A-Z, a-z, 0-9 e especiais.

A-Za-z0-9> = 2caracteres especiais> = 2comprimento da corda> = 8

Então eu quero forçar o usuário a usar pelo menos 2 dígitos e pelo menos 2 caracteres especiais. Ok meu script funciona, mas me obriga a usar os dígitos ou caracteres de volta para trás. Eu não quero isso. por exemplo. password testABC55 $ é válido - mas eu não quero isso.

Em vez disso, quero testar o $ ABC5 # 8 para ser válido. Então basicamente os dígitos / char especial podem ser os mesmos ou diff -> mas devem ser divididos na string.

CÓDIGO PHP:

$uppercase = preg_match('#[A-Z]#', $password);
$lowercase = preg_match('#[a-z]#', $password);
$number    = preg_match('#[0-9]#', $password);
$special   = preg_match('#[\W]{2,}#', $password); 
$length    = strlen($password) >= 8;

if(!$uppercase || !$lowercase || !$number || !$special || !$length) {
  $errorpw = 'Bad Password';

questionAnswers(3)

yourAnswerToTheQuestion