Wie ändert man den Fall eines Strings in PHP? Passwort zu Passwort?

Wie in diesem erwähntMeta-FrageFacebook akzeptiert die genau entgegengesetzte Groß- und Kleinschreibung unseres Passworts. Zum Beispiel:

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

Wie erhalte ich die zweite Variante, vorausgesetzt, die erste ist die vom Benutzer eingegebene Originalvariante (oder die erste, wenn der Benutzer die zweite Version eingibt)? Hier ist meine Meinung dazu.

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

Aber wie kann man Passwörter mit Sonderzeichen verarbeiten (alles auf einer normalen englischen Tastatur möglich)?

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

Dies funktioniert nicht bei allen oben genannten Sonderzeichen.

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

Ich bin kein RegEx-Experte. Wie ändere ich den oben genannten RegEx, um sicherzustellen, dass alle oben genannten Sonderzeichen verarbeitet werden?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage