Der schnellste Weg ist mit einer Bitmaske. Keine klobigen String-Funktionen oder Regex. PHP ist ein Wrapper für C, so können wir Bits manipulieren ganz einfach, wenn Sie Ihre logische Funktion wie OR wissen, NOT, AND, XOR, NAND, etc ..:
function swapCase($string) {
for ($i = 0; $i < strlen($string); $i++) {
$char = ord($string{$i});
if (($char > 64 && $char < 91) || ($char > 96 && $char < 123)) {
$string{$i} = chr($char^32);
}
}
return $string;
}
Dies ist, was es ändert:
$string{$i} = chr($char^32);
Wir nehmen den N-ten Zeichen in $string
und eine XOR (^) durchzuführen, den Interpreter zu sagen den ganzzahligen Wert von $char
und Vertauschen der 6. Bit (32) von einer 1 auf 0 oder von 0 bis 1.
zu ergreifen
Alle ASCII - Zeichen sind 32 entfernt von ihren Gegenstücken (ASCII war ein geniales Design aus diesem Grund. Da 32 eine Potenz von 2 ist (2^5), ist es einfach Bits zu verschieben. Um den ASCII-Wert eines Briefes zu erhalten, verwenden Sie die in PHP-Funktion gebaut ord()
:
ord('a') // 65
ord('A') // 97
// 97 - 65 = 32
So Sie Schleife durch die Zeichenfolge strlen()
als Mittelteil der for
Schleife, und es wird Schleife genau die Anzahl der Male wie deine Zeichenfolge Buchstaben hat. Wenn das Zeichen an Position $i
ein Buchstabe ist (a-z (65-90) oder A-Z (97-122)), wird das Zeichen für das Groß- oder Kleinbuchstabe mit einer Bitmaske ausgetauscht.
Hier ist, wie die Bitmaske funktioniert:
0100 0001 // 65 (lowercase a)
0010 0000 // 32 (bitmask of 32)
--------- // XOR means: we put a 1 if the bits are different, a 0 if they are same.
0110 0001 // 97 (uppercase A)
Wir können es umkehren:
0110 0001 // 97 (A)
0010 0000 // Bitmask of 32
---------
0100 0001 // 65 (a)
Keine Notwendigkeit für str_replace
oder preg_replace
, wir tauschen Bits nur zu addieren oder subtrahieren 32 von der ASCII-Wert der Charakter und wir tauschen Fälle aus. Das 6. Bit (6. von rechts) bestimmt, ob das Zeichen Groß- oder Kleinbuchstaben ist. Wenn es eine 0 ist, ist es Kleinbuchstaben und 1 wenn Großbuchstaben. Ändert man das Bit von einer 0 auf eine 1, so wird 32, der Großbuchstabe chr()
und der Wechsel von einer 1 zu einer 0 subtrahiert 32, wobei ein Großbuchstabe in Kleinbuchstaben umgewandelt wird.
swapCase('userId'); // USERiD
swapCase('USERiD'); // userId
swapCase('rot13'); // ROT13
Wir können auch eine Funktion, die den Fall auf einem bestimmten Zeichen tauscht:
// $i = position in string
function swapCaseAtChar($string, $i) {
$char = ord($string{$i});
if (($char > 64 && $char < 91) || ($char > 96 && $char < 123)) {
$string{$i} = chr($char^32);
return $string;
} else {
return $string;
}
}
echo swapCaseAtChar('iiiiiiii', 0); // Iiiiiiii
echo swapCaseAtChar('userid', 4); // userId
// Numbers are no issue
echo swapCaseAtChar('12345qqq', 7); // 12345qqQ
Jede Idee, wie der Fall einer Zeichenfolge zu überprüfen? – tarnfeld
Dies funktioniert wahrscheinlich nur für ASCII-Zeichen. Eine Alternative zu 'strotolower()' könnte 'mb_strtolower()' sein. – Messa
'ctype_lower()' http://php.net/manual/en/function.ctype-lower.php –