6

このメタ質問で述べたように、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)

最初のバリエーションがユーザーによって入力された元のバリエーションである場合、2番目のバリエーションを取得する方法(またはユーザーが2番目のバージョンを入力したときに最初のバリエーションを取得する方法)?これが私の見解です。

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

私は正規表現の専門家ではないので、上記のすべての特殊文字を確実に処理するように上記の正規表現を変更するにはどうすればよいですか?

4

5 に答える 5

6

文字列の大文字と小文字を逆にするには、次の関数を使用します。

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

私は同じことをしようとしていたときに、何年も前にphp.netのマニュアルでそれを見つけました。私はそれを関数に変えました。

于 2012-05-23T10:45:05.057 に答える
3

文字列内の文字の大文字小文字を切り替える関数は次のとおりです。

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

これがお役に立てば幸いです

同じ例がこのリンクに示されています。

于 2012-05-23T10:50:22.037 に答える
2

この質問に対する以前の回答は、azでのみ機能します。これは、すべてのUnicode文字で機能します。

  • ö->Ö
  • Å->å
  • ü->Ü
  • 等々

    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;
    }
    
于 2012-05-23T11:24:15.197 に答える
2

ctype_upper,ctype_lower文字列内の大文字と小文字を見つけるために探索する必要があります。その後、大文字と小文字strtolower and strtoupperを変更するために使用できます。

于 2012-05-23T10:40:51.990 に答える
0

Joakimの答えは正しい方向に進んでいますが、1行が間違っています。Replacewith Only$char = $str[$i];$char = mb_substr($str, $i, 1); 使用すると、ドイツ語を含むすべてのUnicode文字で機能します。

于 2017-02-26T04:10:16.363 に答える