jak zmienić wielkość ciągu w php? paSSw5ORD do PAssW5ord?

Jak wspomniano w tymMeta Pytanie, Facebook akceptuje dokładnie odmienną odmianę naszego hasła. Na przykład:

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

Jak uzyskać drugą odmianę, pod warunkiem, że pierwsza jest oryginalna, wprowadzona przez użytkownika (lub aby uzyskać pierwszą, gdy użytkownik wprowadzi drugą wersję)? Oto moje zdanie na ten temat.

<?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;
?>

Ale jak sprawić, by przetwarzał hasła za pomocą znaków specjalnych (wszystkie możliwe na standardowej angielskiej klawiaturze?

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

To nie działa na wszystkich powyższych znakach specjalnych.

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. 
}

Nie jestem ekspertem od RegEx, więc jak zmodyfikować powyższy RegEx, aby upewnić się, że przetwarza wszystkie wyżej wymienione znaki specjalne?

questionAnswers(5)

yourAnswerToTheQuestion