strtr()
La funzione strtr() in PHP traduce caratteri e sottostringhe in una stringa, utile per elaborazione di testo e sostituzioni efficienti.
Introduzione
La funzione strtr() in PHP traduce sottostringhe all'interno di una stringa. È particolarmente utile per l'elaborazione di testo in cui sequenze specifiche devono essere sostituite in modo efficiente. Questo articolo ne illustra la sintassi, il comportamento e l'utilizzo pratico.
Comprendere la funzione strtr()
La funzione strtr() supporta due firme:
Firma con array
strtr(string $str, array $replace) : stringQui, $str è la stringa di input e $replace è un array associativo che mappa le sottostringhe con le loro sostituzioni. La funzione sostituisce tutte le occorrenze delle chiavi con i valori corrispondenti.
Firma a tre argomenti
strtr(string $str, string $from, string $to) : stringIn questa forma, $from e $to devono avere la stessa lunghezza. Ogni carattere in $from viene mappato al carattere nella stessa posizione in $to.
Comportamento importante: strtr() sostituisce le sottostringhe usando un algoritmo che privilegia la corrispondenza più lunga. Ciò significa che i pattern sovrapposti vengono risolti dando priorità alla corrispondenza più lunga, e le sostituzioni non vengono applicate ricorsivamente all'output.
Forma con array: sostituzione di sottostringhe
L'uso più comune di strtr() è la forma a due argomenti con array. Si passa un array associativo che mappa ogni sottostringa da cercare al valore con cui deve essere sostituita.
Qui strtr() sostituisce ogni "H" con "J" e ogni "W" con "Z". Le chiavi possono avere qualsiasi lunghezza, quindi è possibile mappare parole intere con la stessa facilità dei singoli caratteri:
<?php
$string = "The quick brown fox";
echo strtr($string, ["quick" => "slow", "brown" => "red"]);
// Output: The slow red foxLe sostituzioni vengono applicate in un unico passaggio
Questo è il comportamento che crea confusione. strtr() analizza la stringa una sola volta e non riesamina mai il testo già sostituito. Quindi un valore inserito non verrà nuovamente abbinato da un'altra regola:
<?php
echo strtr("Hi all, I said hello", ["Hi" => "Hello", "hello" => "hi"]);
// Output: Hello all, I said hiIl "Hi" diventa "Hello", ma quel nuovo "Hello" non viene poi trasformato in "hi" dalla seconda regola — la sostituzione non è ricorsiva. Questo rende strtr() sicuro per scambiare due valori contemporaneamente (ad esempio "yes" <-> "no"), operazione che str_replace() non può eseguire in una singola chiamata.
Vince la corrispondenza più lunga
Quando due chiavi potrebbero corrispondere nella stessa posizione, strtr() preferisce sempre quella più lunga:
<?php
echo strtr("a b c", ["a b" => "X", "a" => "Y"]);
// Output: X cAnche se "a" appare prima nell'array, la chiave più lunga "a b" corrisponde in quella posizione e ha la priorità. L'ordine dell'array non ha importanza — conta solo la lunghezza della chiave.
Forma a tre argomenti: traduzione carattere per carattere
La forma a tre argomenti mappa i singoli caratteri. $from e $to devono avere la stessa lunghezza; ogni carattere in $from viene sostituito dal carattere nella stessa posizione in $to.
<?php
echo strtr("Hello World", "lo", "LO");
// Output: HeLLO WOrLdOgni l diventa L e ogni o diventa O. Se $from è più lungo di $to, i caratteri in eccesso vengono ignorati. Questa forma è utile per semplici scambi simili a cifrari o per normalizzare i caratteri, ma può sostituire solo singoli caratteri — usare la forma con array quando è necessario sostituire sottostringhe di più caratteri.
strtr() vs str_replace()
Entrambe le funzioni sostituiscono testo, ma si comportano in modo diverso:
strtr()opera in un unico passaggio non ricorsivo e risolve i conflitti per corrispondenza più lunga. Il testo sostituito non viene mai riesaminato.str_replace()applica le sue regole in sequenza, quindi una sostituzione precedente può essere nuovamente abbinata da una successiva. È anche case-sensitive (usarestr_ireplace()per la sostituzione senza distinzione tra maiuscole e minuscole).
Scegliere strtr() quando si dispone di una mappa fissa di scambi che devono avvenire ciascuno esattamente una volta — escape, traslitterazione o scambi bidirezionali. Per la sostituzione basata su pattern, usare invece preg_replace().
Conclusione
La funzione strtr() offre un modo efficiente per tradurre sottostringhe in PHP. Supporta sia la mappatura basata su array che la traduzione carattere per carattere tramite la forma a tre argomenti. Poiché opera in un unico passaggio utilizzando la logica della corrispondenza più lunga, è adatta agli scambi una tantum ed è spesso più veloce delle chiamate concatenate a str_replace(). Comprendere le regole del passaggio singolo e della corrispondenza più lunga aiuta a scegliere lo strumento giusto per ogni attività di elaborazione del testo.