как изменить регистр строки в php? paSSw5ORD в PAssW5ord?

Как упоминалось в этом мета-вопросе , Facebook принимает абсолютно противоположный вариант нашего пароля. Например:

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

Как получить второй вариант, если первый из них является оригинальным, введенным пользователем (или первым, когда пользователь входит во вторую версию)? Вот мой пример.

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

Но как заставить его обрабатывать пароли со специальными символами (все возможно на стандартной английской клавиатуре?

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

Это не работает над всеми вышеприведенными символами.

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

Я не эксперт RegEx, поэтому, как изменить вышеприведенный RegEx, чтобы убедиться, что он обрабатывает все вышеупомянутые специальные символы?

Solutions Collecting From Web of "как изменить регистр строки в php? paSSw5ORD в PAssW5ord?"

Вот функция для переключения случая символов в строке.

 <?php $string = "Hello"; // the string which need to be toggled case $string_length = strlen($string); // calculate the string length for($i=0;$i<$string_length;$i++){ // iterate to find ascii for each character $current_ascii = ord($string{$i}); // convert to ascii code if($current_ascii>64 && $current_ascii<91){ // check for upper case character $toggled_string .= chr($current_ascii+32); // replace with lower case character }elseif($current_ascii>96 && $current_ascii<123){ // check for lower case character $toggled_string .= chr($current_ascii-32); // replace with upper case character }else{ $toggled_string .= $string{$i}; // concatenate the non alphabetic string. } } echo "The toggled case letter for $string is <hr />".$toggled_string; // output will be hELLO ?> 

Надеюсь, что это поможет вам

Тот же пример приведен в этой ссылке .

Чтобы инвертировать случай строки, я использую эту функцию:

 function invert_case($string) { return preg_replace('/[az]/ie', '\'$0\' ^ str_pad(\'\', strlen(\'$0\'), \' \')', $string); } 

Я нашел его в руководстве php.net в давние времена, пока я искал сделать то же самое. Я просто превратил его в функцию.

вам нужно изучить ctype_upper,ctype_lower чтобы найти буквы верхнего и нижнего регистра в строке, тогда вы можете использовать strtolower and strtoupper чтобы изменить регистр букв.

Предыдущие ответы на этот вопрос работают только на az. Это работает для всех символов Юникода.

  • ö -> Ö
  • Å -> å
  • ü -> Ü
  • и так далее

     function invert_case($str) { $inverted = ''; for($i=0;$i<mb_strlen($str);$i++) { $char = $str[$i]; $upper = mb_strtoupper($char); if($upper == $char) { $inverted .= mb_strtolower($char); } else { $inverted .= $upper; } } return $inverted; } 

Ответ Джоакима находится на правильном пути, но одна строка неверна: Замените $char = $str[$i]; с $char = mb_substr($str, $i, 1); Только тогда он будет работать для всех символов юникода, включая немецкий.