Heim  >  Artikel  >  Backend-Entwicklung  >  Eine Erklärung einiger seltsamer Verhaltensweisen der strtr-Funktion in PHP

Eine Erklärung einiger seltsamer Verhaltensweisen der strtr-Funktion in PHP

不言
不言Original
2018-06-28 16:19:201497Durchsuche

Dieser Artikel stellt hauptsächlich die Erklärung einiger seltsamer Verhaltensweisen der strtr-Funktion in PHP vor. Jetzt kann ich ihn mit Ihnen teilen.

Einige seltsame Verhaltensweisen von strtr Funktion in PHP Erklärung des Verhaltens

Vor ein paar Tagen schickte mir ein Freund einen Artikel zum Lesen, in dem er sagte, dass die strtr-Funktion einige seltsame Verhaltensweisen aufweist

Beim Betrachten des Quellcodes von PHP habe ich Ich habe die folgende Erklärung erhalten:

[Seltsames Verhalten 1]
Werfen wir zunächst einen Blick auf die beiden Zustände dieser PHP-String-Ersetzungsfunktion strtr()
strtr(string,from,to)
oder strtr(string,array )
Zunächst für die erste Methode der strtr-Funktion
Sehen wir uns das folgende Beispiel an:

   echo strtr("I Love you","Lo","lO");

Das erhaltene Ergebnis ist
ICH LIEBE DICH

Dieses Ergebnis erinnert uns

1.strtr Es wird zwischen Groß- und Kleinschreibung unterschieden

[Quellcode-Analyse 1]
Die endgültige Implementierungsfunktion der strtr-Funktion ist php_strtr Funktion in Zeile 2670 der Datei string.c Der Quellcode lautet wie folgt:

   PHPAPI char *php_strtr(char *str, int len, char *str_from, char *str_to, int trlen){int i;unsigned char xlat[256]; 
 if ((trlen < 1) || (len < 1)) {return str;} 
 for (i = 0; i < 256; xlat[i] = i, i++); 
 for (i = 0; i < trlen; i++) {xlat[(unsigned char) str_from[i]] = str_to[i];} 
 for (i = 0; i < len; i++) {str[i] = xlat[(unsigned char) str[i]];} 
 return str;}

Die gesamte Funktion führt eine Hash-Ersetzung für 256 Zeichen durch. Natürlich enthalten diese 256 Zeichen Groß- und Kleinbuchstaben

[Seltsames Verhalten 2]

2.strtr-Ersatz ist etwas ganz Besonderes. Das O in der Mitte ist offensichtlich nicht unsere Absicht Zeichen basieren auf Zeichen, daher ist die Ersetzung ein Zeichen, keine Zeichenfolge

[Seltsames Verhalten 3]

Geben Sie ein weiteres spezielles Beispiel zur Veranschaulichung dieser PHP-STTR-Funktion. Das seltsame Ergebnis von

   echo strtr("I Love you","Love","");

ist

I Love you

und ändert nichts. Strtr muss also darauf achten, dass es nicht durch empty ersetzt werden kann, was der letzte Parameter ist ein leerer String sein, Leerzeichen sind natürlich erlaubt.

[Quellcode-Analyse drei]

In Zeile 2833 der Datei string.c können wir sehen, dass das aufrufende Programm wie folgt lautet:

   php_strtr(Z_STRVAL_P(return_value),
 Z_STRLEN_P(return_value),
 Z_STRVAL_PP(from),
 Z_STRVAL_PP(to),
 MIN(Z_STRLEN_PP(from), 
 Z_STRLEN_PP(to)));

MIN(Z_STRLEN_PP( from), Z_STRLEN_PP (to)) ist die kleinste der Längen der beiden Strings from und to. In dem in Abbildung 3 gezeigten Fall ist das Ergebnis 0. Aus der Funktion php_strtr können wir sehen, dass

if ((trlen < 1) || (len < 1)) {return str;}

wenn die Länge kleiner als 1 ist. Gibt die ursprüngliche Zeichenfolge zurück. Also. . . .

[Seltsames Verhalten 4]

Ein weiteres Beispiel für die Strtr-Funktion

 echo strtr("I Loves you","Love","lOvEA");

Das Ergebnis ist

I lOvEs yOu

Achten Sie darauf der dritte Parameter A. Er erscheint nicht im Ergebnis

[Quellcode-Analyse drei]

Der Grund ist ähnlich wie beim zweiten MIN(Z_STRLEN_PP(from), Z_STRLEN_PP(to)) nimmt beides von und bis. Die kleinste der Längen von Zeichenfolgen

rrree

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Lernen aller hilfreich ist. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.


Verwandte Empfehlungen:

Über die Analyse von HashTable im PHP-Quellcode

Über die Analyse von Zend HashTable im PHP-Quellcode

Das obige ist der detaillierte Inhalt vonEine Erklärung einiger seltsamer Verhaltensweisen der strtr-Funktion in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn