Как упоминалось в этом мета-вопросе , 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, чтобы убедиться, что он обрабатывает все вышеупомянутые специальные символы?
Вот функция для переключения случая символов в строке.
<?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);
Только тогда он будет работать для всех символов юникода, включая немецкий.