как изменить регистр строки в 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, чтобы убедиться, что он обрабатывает все вышеупомянутые специальные символы?


person DavChana    schedule 23.05.2012    source источник
comment
Не работает значит.. если в пароле есть символ $, php просто думает, что это имя переменной. echo pas$word, php думает, что я прошу его повторить pas+Value of $word..   -  person DavChana    schedule 23.05.2012
comment
@meze pas$word — это просто пример. Знак $ может быть где угодно в строке/пароле пользователя, полученной из поля HTML-формы.   -  person DavChana    schedule 23.05.2012


Ответы (5)


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

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

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

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

person Dhruvisha    schedule 23.05.2012
comment
Работает так, как и ожидалось, дополнительное преимущество в том, что нет регулярного выражения :) Будет просто делать отступ и использовать его как есть. - person DavChana; 23.05.2012
comment
Почему люди предпочитают уродливый код простому (как написал @Nick) ;s - person meze; 23.05.2012
comment
Поздравляю!! Рад помочь вам. - person Dhruvisha; 23.05.2012
comment
@meze Это не уродливо, проверьте тот же код, с отступом. Может быть, Друвиша написал это в спешке. (Не то, чтобы я рекомендовал, но я буду использовать его так: codepad.org/FBWMww7W - person DavChana; 23.05.2012
comment
@meze не безобразный и не порочный, как твой. Проверьте свой код с помощью ^ (Shift + 6), он изменит его на что-то другое. codepad.org/nWb1WJIl - person DavChana; 23.05.2012
comment
@ Давиндер забыл, что есть пробел. И удалил мое предыдущее решение. Затем код можно исправить и сделать еще короче: viper-7.com/G2Gal8 - person meze; 23.05.2012

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

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

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

person Nick    schedule 23.05.2012
comment
почему такая сложная замена. "'\$0' ^ ' '" не сработает?? - person meze; 23.05.2012
comment
Работает, меняет paSS#12wOrD на Pass#12WoRd, но я предпочитаю ответ @Dhruvisha за то, что он делает это без RegEx. Спасибо, в любом случае. Не могу понять, как это делается без какого-либо цикла? - person DavChana; 23.05.2012
comment
@Davinder решение для регулярных выражений чище и делает то же самое в одну строку вместо 12; P - person meze; 23.05.2012
comment
@meze Да, чище и короче, и это работает, но я не могу понять, как это работает .. Хотя я это записал. - person DavChana; 23.05.2012
comment
Я действительно не понимаю, почему вы считаете отсутствие регулярных выражений преимуществом. Решение Regex делает это намного быстрее и в одну строку кода. Кроме того, @meze "'\$0' ^ ' '" тоже подойдет, не совсем уверен, почему там были str_pad и т. Д. - должна быть причина... - person Nick; 23.05.2012
comment
@Ник, нет никакой пользы в решении без регулярных выражений, единственное, что мне очень сложно понять, выражения регулярных выражений. Тем не менее, я собираюсь использовать ваше решение в производственной среде. Вот почему я записал ваш код и проголосовал за него. - person DavChana; 24.05.2012

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

person jugnu    schedule 23.05.2012
comment
Код работает с паролями, составленными из A_Z, a-z 0-9. Но пароли со знаками препинания не обрабатываются. Я предполагаю, что и Ctype_upper, и strtoupper выполняют одинаковую работу. ? - person DavChana; 23.05.2012
comment
Вы хотите избавиться от символов? - person jugnu; 23.05.2012
comment
` $text = preg_replace(/(?![.=$'€%-])\p{P}/u, , $text); ` это позволит получить все знаки препинания из вашей строки - person jugnu; 23.05.2012
comment
Нет, если в цикле какой-либо символ встречается в $pass, мне нужно, чтобы он был добавлен как есть к $pass2 - person DavChana; 23.05.2012
comment
PASS#12WORD to PASS#12WORD Мой код отлично работает с цифрами и алфавитами. Но не с символами. - person DavChana; 23.05.2012
comment
вы можете использовать ctype_punct(), чтобы получить все знаки препинания из вашей строки - person jugnu; 23.05.2012
comment
я думаю, вам может понадобиться проверить это руководство по php [php.net/manual/en/ book.ctype.php] - person jugnu; 23.05.2012
comment
хорошо, но моя проблема решена без проверки приведенной выше ссылки.. Без использования 10+ функций.. Кстати, в вашей ссылке есть дополнительный ], что приводит к сообщению Not-Found на php.net.. - person DavChana; 23.05.2012
comment
Я рад, что вы нашли решение. но всегда полезно немного изучить для будущего и лучшего понимания, спасибо - person jugnu; 23.05.2012

Предыдущие ответы на этот вопрос работают только для 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;
    }
    
person Joakim Syk    schedule 23.05.2012
comment
Работает, но только после удаления mb_ из strten, strtoupper, strlower (по крайней мере, на codepad (со строгой средой выполнения)) codepad.org/ 7MUwFd2C - person DavChana; 23.05.2012

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

person user6371556    schedule 26.02.2017