¿Cómo alterar el caso de una cadena en php? paSSw5ORD a PAssW5ord?

Como se menciona en esteMeta pregunta, Facebook acepta la variación exacta del caso opuesto de nuestra contraseña. Por ejemplo:

1.- paSSw5ORD  (Original password)
2.- PAssW5ord  (Case altered to exact opposite, Capital->Small and vice-versa.)
3.- PaSSw5ORD  (Only first letter's case altered)

¿Cómo obtener la segunda variación, siempre que la primera sea la original, ingresada por el usuario (o para obtener la primera cuando el usuario ingrese a la segunda versión)? Aquí está mi opinión sobre esto.

<?php

$pass = "paSSw5ORD"; //Example password
$pass_len = strlen($pass); //Find the length of string

for($i=0;$i<$pass_len;$i++){
    if(!(is_numeric($pass[$i]))){                 //If Not Number
        if($pass[$i]===(strtoupper($pass[$i]))){  //If Uppercase
            $pass2 .= strtolower($pass[$i]);      //Make Lowercase & Append
        } else{                                   // If Lowercase
            $pass2 .= strtoupper($pass[$i]);      //Make Uppercase & Append
        }
    } else{                  //If Number
        $pass2 .= $pass[$i]; //Simply Append
    }
}

//Test both
echo $pass."\r\n";
echo $pass2;
?>

Pero, ¿cómo hacerlo procesar contraseñas con caracteres especiales (todo esto es posible en un teclado inglés estándar?

!@#$%^&*()_+|?><":}{~[];',./     (Space also)

Esto no funciona en todos los caracteres especiales anteriores.

if(preg_match('/^\[a-zA-Z]+$/', "passWORD")){
//Special Character encountered. Just append it and
//move to next cycle of loop, similar to when we
//encountered a number in above code. 
}

No soy un experto en RegEx, ¿cómo modificar el RegEx anterior para asegurarnos de que procesa todos los caracteres especiales mencionados anteriormente?

Respuestas a la pregunta(5)

Su respuesta a la pregunta