2012-05-23 12 views
6

Jak wspomniano w tej Meta Question, Facebook akceptuje dokładnie odwrotną zmianę przypadku naszego hasła. Na przykład:jak zmienić wielkość liter w php? PASSw5ORD do PAssW5ord?

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

Jak zdobyć drugą odmianę, pod warunkiem, że pierwszy z nich jest oryginalny, wprowadzone przez użytkownika (lub dostać się pierwsza, gdy użytkownik wchodzi druga wersja)? Oto moje zdanie na ten temat.

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

Ale jak uczynić go przetwarzać haseł ze znakami specjalnymi (wszystkie możliwe na standardowej klawiaturze angielskiej?

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

to nie działa na wszystkie powyższe znaki specjalne.

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

Nie jestem ekspertem od RegEx, więc jak zmienić powyższy RegEx, aby upewnić się, że przetwarza wszystkie wyżej wymienione znaki specjalne?

+0

Doesnot oznacza, że ​​... jeśli w haśle znajduje się symbol $, php po prostu uważa, że ​​jest to nazwa zmiennej. echo "pas $ word", php myśli, że pytam o echo pas + Wartość $ word .. – DavChana

+0

@meze pas $ word to tylko przykład. Znak $ może być w dowolnym miejscu łańcucha/hasła użytkownika. Otrzymany z pola formularza HTML. – DavChana

Odpowiedz

3

Oto funkcja do przełączania wielkości liter w łańcuchu znaków.

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

nadzieję, że pomoże Ci

sam przykład jest podany w tym link.

+0

Działa zgodnie z oczekiwaniami, dodatkową korzyścią jest to, że nie ma Regexu :) Będzie tylko wcięcie i użycie go tak jak jest. – DavChana

+0

paSS # 12wOrD -> PAss # 12WoRd – DavChana

+1

Dlaczego ludzie wybierają brzydki kod nad prostym (jak ** @ Nick ** wysłany); s – meze

2

Musisz wyszukać ctype_upper,ctype_lower, aby znaleźć wielkie i małe litery w ciągu znaków, a następnie można użyć strtolower and strtoupper, aby zmienić wielkość liter.

+0

Kod działa z hasłami wykonanymi z A_Z, a-z 0-9. Hasła z symbolami interpunkcyjnymi nie są przetwarzane. Sądzę, że luźno zarówno Ctype_upper, jak i strtoupper wykonują tę samą pracę. ? – DavChana

+0

chcesz pozbyć się symboli? – jugnu

+0

'$ text = preg_replace (" /(?![.=$ "€% -]) \ p {P}/u", "", $ tekst); ' to otrzyma wszystkie znaki interpunkcyjne z ciągu znaków – jugnu

6

Aby odwrócić przypadek ciąg używam tej funkcji:

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

Znalazłem go w php.net manual wieki temu, gdy szukałem, aby zrobić to samo. Właśnie zmieniłem to w funkcję.

+0

, dlaczego wymiana jest tak skomplikowana. Czy nie "" "\ $ 0"^"" "działa? – meze

+0

Działa, zmienia paSS # 12wOrD na PAss # 12WoRd, ale będę faworyzował odpowiedź @Dhruvisha na zrobienie tego bez RegEx. Dzięki i tak. Nie możesz zrozumieć, jak to działa bez jakiejkolwiek pętli? – DavChana

+2

@Davinder rozwiązanie regex jest czystsze i robi to samo w jednym wierszu zamiast 12; P – meze

2

Poprzednie odpowiedzi na to pytanie działają tylko w przypadku a-z. Działa to dla wszystkich znaków Unicode.

  • O -> O
  • Å -> A
  • U -> U
  • i tak dalej

    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; 
    } 
    
+0

Działa, ale tylko po usunięciu mb_ ze strten, strtoupper, strlower (co najmniej na codepterze (ze ścisłym środowiskiem uruchomieniowym)) http://codepad.org/7MUwFd2C – DavChana

+0

http://www.php.net/manual/en/mbstring.installation.php –

0

odpowiedź Joakim jest na dobrej drodze, ale jeden linia jest nieprawidłowa: Wymień $char = $str[$i]; z $char = mb_substr($str, $i, 1); Tylko wtedy będzie ork dla wszystkich znaków Unicode, w tym niemieckich.

Powiązane problemy