Es fällt mir schwer zu verstehen, wann strtr
es vorzuziehen wäre str_replace
oder umgekehrt. Es scheint möglich zu sein, mit beiden Funktionen genau die gleichen Ergebnisse zu erzielen, obwohl die Reihenfolge, in der Teilzeichenfolgen ersetzt werden, umgekehrt ist. Beispielsweise:
echo strtr('test string', 'st', 'XY')."\n";
echo strtr('test string', array( 's' => 'X', 't' => 'Y', 'st' => 'Z' ))."\n";
echo str_replace(array('s', 't', 'st'), array('X', 'Y', 'Z'), 'test string')."\n";
echo str_replace(array('st', 't', 's'), array('Z', 'Y', 'X'), 'test string');
Dies gibt aus
YeXY XYring
YeZ Zring
YeXY XYring
YeZ Zring
Gibt es neben der Syntax einen Vorteil bei der Verwendung übereinander? Gibt es Fälle, in denen man nicht ausreichen würde, um ein gewünschtes Ergebnis zu erzielen?
php
string
str-replace
strtr
andrewtweber
quelle
quelle
strtr
dies leicht falsch verstanden werden, dastrstr
dies ganz anders ist. Ich fange an zu glauben, ich sei Legastheniker. Ich werde diesen Fehler nicht mit str_replace machen.Antworten:
Erster Unterschied:
Ein interessantes Beispiel für ein anderes Verhalten zwischen
strtr
und finden Siestr_replace
im Kommentarbereich des PHP-Handbuchs:Verwenden Sie stattdessen "strtr", damit dies funktioniert:
Dies bedeutet, dass dies
str_replace
ein globalerer Ansatz für das Ersetzen ist, währendstrtr
die Zeichen einfach einzeln übersetzt werden.Ein weiterer Unterschied:
Angesichts des folgenden Codes (entnommen aus dem PHP String Replacement Speed Comparison ):
Die resultierenden Textzeilen sind:
Die Haupterklärung:
Dies geschieht, weil:
strtr : sortiert seine Parameter nach Länge in absteigender Reihenfolge, also:
str_replace : Es funktioniert in der Reihenfolge, in der die Schlüssel definiert sind.
dann findet es den nächsten Schlüssel: "PHP: Hypertext Preprocessor" im resultierenden Text des vorherigen Schritts, so dass es durch "PHP" ersetzt wird, was als Ergebnis ergibt:
Es sind keine Schlüssel mehr zu suchen, daher endet der Austausch dort.
quelle
strtr
Ersetzt keinen Text, der durch vorherige Ersetzungen eingefügt wurde.strtr('foo', array('oo' => 'ie', 'e' => 't'))
kehrt'fie'
statt'fit'
wiestr_replace
folgt zurück. Somit wird das von @Pies angesprochene Problem automatisch behoben.Dies ist nicht immer der Fall und hängt von den von Ihnen angegebenen Such- und Ersetzungsdaten ab. Wenn sich die beiden Funktionen unterscheiden, siehe: Hat PHP str_replace eine Beschränkung von mehr als 13 Zeichen?
strtr
wird nicht in Teilen der Zeichenfolge ersetzt, die bereits ersetzt wurden -str_replace
ersetzt innerhalb von Ersetzungen.strtr
beginnt mit der längsten Taste zuerst, falls Sie sie mit zwei Parametern aufrufen -str_replace
wird von links nach rechts ersetzt.str_replace
kann die Anzahl der durchgeführten Ersetzungen zurückgeben -strtr
bietet keinen solchen Zählwert.quelle
Ich denke,
strtr
bietet eine flexiblere und bedingte Ersetzung, wenn sie mit zwei Argumenten verwendet wird, zum Beispiel: Wenn die Zeichenfolge 1 ist, ersetzen Sie sie durch a, aber wenn die Zeichenfolge 10 ist, ersetzen Sie sie durch b. Dieser Trick konnte nur erreicht werden durchstrtr
.siehe: Php Manual Strtr .
quelle
Hinweis im Handbuch STRTR-- Beschreibung string strtr (string $ str, string $ from, string $ to) string strtr (string $ str, array $ replace_pairs) Wenn drei Argumente angegeben werden, gibt diese Funktion eine Kopie von str zurück, wobei ...
STR_REPLACE-- ... Wenn Suchen oder Ersetzen Arrays sind, werden ihre Elemente zuerst bis zuletzt verarbeitet . ...
STRTR wirkt sich in jeder Runde NICHT auf die nächste aus, ABER STR_REPLACE.
quelle