str_replace en php : comment remplacer du texte dans une chaîne de caractères ?

La fonction str_replace() en PHP est un outil incontournable pour les développeurs qui souhaitent effectuer des recherches et remplacements précis dans une chaîne de caractères (string) ou un array de chaînes.

Introduite avec PHP 4, cette fonction du langage de programmation PHP reste essentielle dans tous les versions modernes du langage (PHP 5, 7, 8.x) pour nettoyer du code-source, générer des slugs d’URL ou traiter des données utilisateur dans vos scripts.

Signature complète et paramètres décryptés

La syntaxe officielle de str_replace() s’écrit comme dans le code suivant :

str_replace(mixed $search, mixed $replace, mixed $subject, int &$count = null): string|array

Chaque paramètre a un rôle précis que les développeurs doivent bien spécifier.

  • Le paramètre $search contient le pattern ou l’array de chaînes de caractères à rechercher entre guillemets ou crochets.
  • Le paramètre $replace définit les chaînes de remplacement correspondantes avec une virgule entre chaque élément.
  • Le paramètre $subject est la variable principale contenant le texte source, qu’il s’agisse d’une string simple ou d’un array de strings.
  • Enfin, le paramètre optionnel $count est un nom de la variable passée par référence qui reçoit le nombre total de remplacements effectués.

Cette fonction retourne une chaine de caractères ou un tableau

Types de variables acceptés et compatibilité complète

La fonction str_replace() gère avec une grande flexibilité différents types de variables, ce qui en fait un outil polyvalent dans les langages de programmation comme PHP. Les développeurs peuvent traiter une simple chaîne de caractères ou un tableau complexe contenant plusieurs strings sans modifier leur approche. Cette compatibilité permet de nettoyer efficacement des données utilisateur provenant de formulaires, de bases de données ou d’API externes.

Par exemple, dans un script de traitement de commentaires, vous pouvez récupérer du texte contenant des caractères spéciaux comme des parenthèses, crochets, guillemets, entiers, décimal ou des balises HTML indésirables.

Au lieu d’écrire plusieurs fonctions de nettoyage séparées, str_replace() centralise toutes les transformations ,ce qui permet de traiter toutes les occurrences en une fois: :

$commentaire = "J'adore le café éthiopien à 15h30 ! 😊";
$patterns = ['é', '😊', 'à'];
$remplacements = ['e', '😀', 'a'];

$texte_nettoye = str_replace($patterns, $remplacements, $commentaire);
echo $texte_nettoye; 
// Résultat : "J'adore le cafe ethiopien a 15h30 ! 😀"

De même, pour traiter un tableau de messages en masse, la fonction applique les mêmes règles à chaque élément automatiquement :

$messages = [
    "Démo café à Paris",
    "Résèrvation èffèctuée avec çç",
    "Bonjour !"
];

$accents = ['é','è','à','ù','î','ç'];
$ascii = ['e','e','a','u','i','c'];

$messages_nets = str_replace($accents, $ascii, $messages);

foreach ($messages_nets as $message) {
    echo $message . "\n";
}
// Résultat :
// Demo cafe a Paris
// Reservation effectuee avec cc
// Bonjour !

Cette approche unique simplifie considérablement le code-source et le rend facilement compréhensible et utilisables par vos collègues.

Exemples pratiques

Les tutoriels PHP bénéficient grandement d’exemples concrets qui montrent des transformations visibles et immédiatement testables. str_replace() excelle dans ce domaine car les développeurs peuvent démontrer des avant/après avec des données réalistes.

Pour créer un slug SEO à partir d’un titre d’article, les développeurs combinent plusieurs nettoyages en une seule opération :

$titre_article = "Mon Super Article : Les Chiens et Chats !";
echo "Titre original : " . $titre_article . "\n";

// Nettoyage complet en un appel
$recherches = ['é','à',' ','!', ':'];
$remplacements = ['e','a','-','',''];
$slug = strtolower(str_replace($recherches, $remplacements, $titre_article));

echo "Slug généré : " . $slug . "\n";
// Résultat : "mon-super-article-les-chiens-et-chats"

Un autre cas fréquent concerne le nettoyage de balises HTML dangereuses pour les newsletters :

$html_utilisateur = '<p>Mon texte</p><script>alert("hack")</script><strong>important</strong>';
echo "HTML brut : " . $html_utilisateur . "\n";

// Suppression des balises script uniquement
$balises_dangereuses = ['<script>', '</script>'];
$html_securise = str_replace($balises_dangereuses, '', $html_utilisateur);

echo "HTML nettoyé : " . $html_securise . "\n";
// Résultat : <p>Mon texte</p>alert("hack")<strong>important</strong>

Balises HTML et expressions régulières : limites précises à connaître

Malgré sa puissance, str_replace() atteint rapidement ses limites avec les balises HTML complexes et les expressions régulières. Cette fonction recherche des chaînes exactes et littérales, pas des patterns dynamiques ou contextuels, ce qui la rend inadaptée aux transformations sophistiquées.

Prenons un exemple concret de balises HTML avec des attributs dynamiques. Vous souhaitez remplacer toutes les classes user-123 par profil-123 dans du contenu utilisateur :

$html = '<div class="user-123">Mon profil</div><span class="user-456">Autre</span>';
echo "HTML original : " . $html . "\n";

// ❌ ÉCHEC COMPLET : classe dynamique non trouvée
$resultat_simple = str_replace('class="user-', 'class="profil-', $html);
echo "str_replace (échec) : " . $resultat_simple . "\n";
// Aucun changement !

// ✅ SUCCÈS : expression régulière avec capture
$resultat_regex = preg_replace('/class="user-(\d+)"/', 'class="profil-$1"', $html);
echo "preg_replace (succès) : " . $resultat_regex . "\n";
// Résultat : <div class="profil-123">Mon profil</div><span class="profil-456">Autre</span>

De même, pour masquer les prix dans un texte promotionnel :

$promotion = "Prix : 19.99€ et 29.99€ HT";
echo "Texte original : " . $promotion . "\n";

// ❌ str_replace ne comprend PAS les motifs numériques
str_replace("/\d+\.\d{2}€/", "[PRIX]", $promotion);  // AUCUN effet !

// ✅ preg_replace traite le pattern regex
$masque_prix = preg_replace("/\d+\.\d{2}€/", "[PRIX]", $promotion);
echo "Prix masqués : " . $masque_prix . "\n";
// Résultat : "Prix : [PRIX] et [PRIX] HT"

Conclusion pratique : str_replace() est parfait pour des chaînes fixes et connues à l’avance. Dès que les balises HTML contiennent des identifiants ( IDs ) dynamiques, des dates, des nombres ou tout pattern variable, passez immédiatement à preg_replace() avec une expression régulière.

Sensibilité à la casse : majuscules vs minuscules décryptée

Par défaut, str_replace() respecte scrupuleusement la casse des caractères, distinguant parfaitement majuscules et minuscules. Ce comportement, hérité des standards Unix et des scripts shell, garantit des remplacements précis mais oblige les développeurs à anticiper les variations orthographiques dans les données utilisateurs.

Prenons un exemple concret avec un texte contenant plusieurs variantes du mot « chat » :

$texte = "Le Chat dort. Le chat mange.";
echo "Texte original :\n" . $texte . "\n\n";

// str_replace() : sensible à la casse stricte
$resultat_sensible = str_replace("chat", "chien", $texte);
echo "str_replace (sensible) :\n" . $resultat_sensible . "\n\n";
// Résultat : "Le Chat dort. Le chien mange. "

// str_ireplace() : insensible à la casse
$resultat_insensible = str_ireplace("chat", "chien", $texte);
echo "str_ireplace (insensible) :\n" . $resultat_insensible . "\n";
// Résultat : "Le Chien dort. Le chien mange. "

Dans un contexte de normalisation de noms de produits :

$produits = ["iPhone", "IPHONE X", "iphone 11", "iPad"];
echo "Produits originaux :\n";
print_r($produits);

// Normalisation élégante avec plusieurs techniques
$produits_norm = array_map(function($produit) {
    return str_ireplace("IPHONE", "iPhone", ucwords(strtolower($produit)));
}, $produits);

echo "\nProduits normalisés :\n";
print_r($produits_norm);
// Résultat : Array ( [0] => iPhone [1] => iPhone X [2] => iPhone 11 [3] => iPad )

Règle d’or pour les développeurs : utilisez str_replace() pour les constantes techniques du code-source où la casse est contrôlée. Préférez str_ireplace() pour les données utilisateurs imprévisibles comme les commentaires, noms ou saisies de formulaires.

Bonnes pratiques professionnelles pour développeurs

Les développeurs expérimentés adoptent des patterns spécifiques pour optimiser les performances et la lisibilité de str_replace() dans des environnements de production. Ces techniques transforment une fonction simple en outil industriel puissant.

Technique 1 : Un seul appel massif avec des tableaux multidimensionnels

Au lieu d’imbriquer plusieurs str_replace(), les professionnels regroupent tous les patterns dans des arrays :

// ❌ APPROCHE NAÏVE : 8 appels imbriqués (lent)
$texte = str_replace('é','e',
         str_replace('è','e',
         str_replace('à','a',
         str_replace('ù','u',
         str_replace('î','i',
         str_replace('ç','c',
         str_replace('É','E',
         str_replace('È','E', $texte)))))));

// ✅ APPROCHE PROFESSIONNELLE : 1 appel unique
$tableau_accents = [
    'é'=>'e', 'è'=>'e', 'à'=>'a', 'ù'=>'u', 'î'=>'i', 'ç'=>'c',
    'É'=>'E', 'È'=>'E', 'À'=>'A', 'Ù'=>'U', 'Î'=>'I', 'Ç'=>'C'
];

$texte_nettoye = str_replace(
    array_keys($tableau_accents), 
    array_values($tableau_accents), 
    $texte
);

Cette optimisation divise par 8 le temps d’exécution et rend le code-source beaucoup plus lisible.

Technique 2 : Cache des patterns dans une classe utilitaire

Pour les applications à fort trafic, les développeurs pré-calculent les patterns :

class TextCleaner {
    private static $balises_dangereuses = ['<script>', '<iframe>', 'javascript:', 'onerror='];
    private static $balises_securisees = ['&lt;script&gt;', '&lt;iframe&gt;', '', ''];
    
    private static $accents_francais = [
        'é'=>'e', 'è'=>'e', 'à'=>'a', 'ù'=>'u', 'î'=>'i', 'ç'=>'c',
        'É'=>'E', 'È'=>'E', 'À'=>'A'
    ];
    
    public static function nettoyerCommentaire($texte) {
        $texte = str_replace(self::$balises_dangereuses, self::$balises_securisees, $texte);
        return str_replace(array_keys(self::$accents_francais), array_values(self::$accents_francais), $texte);
    }
}

// Usage ultra-performant
$commentaire_securise = TextCleaner::nettoyerCommentaire($commentaire_utilisateur);

Technique 3 : Validation stricte des paramètres

function remplacement_securise($recherche, $remplacement, $sujet) {
    if (empty($recherche) || !is_string($recherche) && !is_array($recherche)) {
        throw new InvalidArgumentException("Le paramètre recherche doit être une chaîne ou un tableau");
    }
    
    if (empty($remplacement)) {
        return $sujet;  // Pas de changement si vide
    }
    
    return str_replace($recherche, $remplacement, $sujet);
}

Checklist finale pour vos codes

Cette checklist professionnelle constitue une référence complète pour maîtriser str_replace() dans tous vos code PHP et scripts de production. Chaque point est accompagné d’explications pratiques :

Paramètres à maîtriser parfaitement

  • [OBLIGATOIRE] $search : chaîne littérale ou array de patterns entre guillemets ou crochets
  • [OBLIGATOIRE] $replace : chaîne ou array de remplacement (même taille ou chaîne vide)
  • [OBLIGATOIRE] $subject : texte source (string ou array) à modifier
  • [OPTIONNEL] $count : variable par référence qui reçoit le nombre de remplacements

Comportements essentiels à tester systématiquement

  •  Arrays de tailles différentes → éléments manquants remplacés par chaîne vide ""
  •  Ordre critique dans $search et $replace (premier trouvé = premier remplacé)
  •  Casse sensible : str_replace() vs str_ireplace() (insensible)
  •  $subject = array → retour d’un array modifié

Alternatives selon le contexte d’utilisation

┌─────────────────────┬─────────────────────┬─────────────────────
│ Besoin précis       │ Fonction            │ Exemple concret                     │
├─────────────────────┼─────────────────────┼─────────────────────
│ Chaînes simples     │ str_replace()       │ "chat" → "chien"                    │
│ Insensible casse    │ str_ireplace()      │ "CHAT" → "chien"                    │
│ Caractère↔caractère │ strtr()             │ "éà" → "ea"                         │
│ Regex complexe      │ preg_replace()      │ /\d+/ → "NUM"                       │
└─────────────────────┴─────────────────────┴─────────────────────

Checklist performance production

  •  Toujours privilégier 1 appel array vs plusieurs str_replace()
  •  Cacher les patterns fréquents dans des constantes ou classes statiques
  • `✓Valider les paramètres avant chaque appel (éviter erreurs fatales)
  •  Pour balises HTML dynamiques → utiliser preg_replace() avec expression régulière

retour à la liste des fonctions

Sources: php.net

Cours

Variables et types

Manipulation de chaînes

Tableaux

Fichiers et système

Sécurité, session et cookie