Aller au contenu principal

Les fonctions de manipulation de chaînes

Notions théoriques

Dans la séance précédente, vous avez appris à coller des chaînes de caractères avec l'opérateur . et à insérer une variable dans une chaîne avec l'interpolation. PHP fournit aussi de nombreuses fonctions natives pour mesurer, découper, remplacer et transformer une chaîne de caractères.

Mesurer la longueur d'une chaîne avec strlen()

La fonction strlen() retourne le nombre de caractères d'une chaîne.

$mot = "PHP";
echo strlen($mot); // 3
info

strlen() compte les octets, pas toujours les caractères "visuels". Avec des caractères accentués encodés en UTF-8 (comme "é"), le résultat peut être plus grand que le nombre de lettres affichées. Pour un comptage correct des caractères multi-octets, utiliser mb_strlen().

Extraire une sous-chaîne avec substr()

La fonction substr() extrait une partie d'une chaîne, à partir d'une position de départ et sur une certaine longueur.

$phrase = "Bonjour le monde";

echo substr($phrase, 0, 7); // Bonjour
echo substr($phrase, 8); // le monde
echo substr($phrase, -5); // monde
remarque

Si on omet le troisième paramètre (la longueur), substr() extrait jusqu'à la fin de la chaîne. Un index de départ négatif compte à partir de la fin de la chaîne.

Remplacer du texte avec str_replace()

La fonction str_replace() remplace toutes les occurrences d'un texte par un autre dans une chaîne.

$texte = "J'aime le PHP";
echo str_replace("PHP", "JavaScript", $texte); // J'aime le JavaScript
info

str_replace() peut aussi remplacer plusieurs mots à la fois en donnant des tableaux en paramètres :

$texte = "Le chat mange la souris";
$texte = str_replace(["chat", "souris"], ["chien", "balle"], $texte);
echo $texte; // Le chien mange la balle

Supprimer les espaces avec trim()

La fonction trim() supprime les espaces (et autres caractères invisibles comme les tabulations) au début et à la fin d'une chaîne.

$saisie = " admin ";
echo trim($saisie); // "admin"
info

ltrim() ne supprime les espaces qu'à gauche, rtrim() qu'à droite. trim() fait les deux à la fois. Ces trois fonctions sont très utiles pour nettoyer une saisie utilisateur avant de la traiter.

Changer la casse avec strtoupper() et strtolower()

Les fonctions strtoupper() et strtolower() convertissent une chaîne en majuscules ou en minuscules.

echo strtoupper("bonjour"); // BONJOUR
echo strtolower("BONJOUR"); // bonjour

Passer d'une chaîne à un tableau (et inversement) avec explode() et implode()

La fonction explode() découpe une chaîne en tableau, selon un séparateur. C'est l'inverse d'implode(), qui assemble un tableau en une chaîne, avec un séparateur entre chaque élément. Cela fait le lien avec les tableaux vus lors d'une séance précédente.

$csv = "pomme,banane,cerise";

$fruits = explode(",", $csv);
print_r($fruits); // ["pomme", "banane", "cerise"]

$phrase = implode(", ", $fruits);
echo $phrase; // pomme, banane, cerise
remarque

implode() accepte aussi un séparateur vide ("") pour coller les éléments sans rien entre eux.

Exemple pratique

<?php
// Nettoyage et formatage d'une saisie utilisateur
$saisie = " Alice DUPONT ";

// 1) trim() : supprimer les espaces superflus
$nomComplet = trim($saisie);

// 2) strtolower() : tout mettre en minuscules
$nomComplet = strtolower($nomComplet);

// 3) explode() : séparer prénom et nom
$parties = explode(" ", $nomComplet);
$prenom = $parties[0];
$nom = $parties[1];

// 4) substr() : récupérer l'initiale du prénom
$initiale = substr($prenom, 0, 1);

// 5) strtoupper() : mettre le nom en majuscules
$nomAffiche = strtoupper($nom);

// 6) str_replace() : remplacer un mot interdit dans un pseudo
$pseudo = str_replace("admin", "utilisateur", "admin123");

// 7) implode() : reconstruire un affichage propre
$affichage = implode(" ", [$initiale . ".", $nomAffiche]);

echo $affichage; // A. DUPONT
echo "\n";
echo "Longueur du nom complet : " . strlen($nomComplet) . " caractères\n";
echo "Pseudo corrigé : " . $pseudo . "\n";
astuce

Il est très fréquent d'enchaîner plusieurs fonctions de chaînes les unes après les autres pour nettoyer puis formater une donnée : trim() puis strtolower() puis ucfirst() par exemple.

Test de mémorisation/compréhension


Que fait la fonction strlen() ?


Que fait la fonction substr() ?


Que fait str_replace('chat', 'chien', 'Le chat dort') ?


Quelle fonction PHP supprime les espaces au début et à la fin d'une chaîne ?


Quelle est la différence entre trim() et rtrim() ?


Que retourne strtoupper('bonjour') ?


Quelle fonction PHP découpe une chaîne en tableau selon un séparateur ?


Quelle fonction PHP assemble un tableau en une chaîne de caractères ?


Que retourne explode(',', 'a,b,c') ?


Pourquoi strlen() peut-elle retourner un nombre plus grand que le nombre de lettres affichées avec des caractères accentués ?


Quelle fonction permet de récupérer uniquement la première lettre d'un prénom en majuscule ?



TP pour réfléchir et résoudre des problèmes

Dans ce TP, vous allez nettoyer et formater une liste d'inscriptions à un évènement, en utilisant les fonctions de manipulation de chaînes vues dans cette séance.

  • Dans votre répertoire "Documents" créez le répertoire tp_fonctions_chaines.
  • Dans ce répertoire créez le fichier main.php :
    <?php
    // Les fonctions de manipulation de chaînes
    print("Les fonctions de manipulation de chaînes \n\n");

    $saisie = " Alice DUPONT ";
  • Testez le fonctionnement de ce fichier :
    php main.php

Étape 1 — Nettoyer la saisie avec trim()

La variable $saisie contient des espaces superflus au début et à la fin. Nettoyez-la avec trim() et stockez le résultat dans $nomComplet.


Bonne pratique - Toujours nettoyer une saisie

Ne jamais faire confiance à une donnée saisie par un utilisateur sans la nettoyer. trim() est souvent la première étape avant de valider ou d'enregistrer une donnée provenant d'un formulaire.

Étape 2 — Normaliser la casse avec strtolower()

Convertissez $nomComplet entièrement en minuscules, pour uniformiser les futures comparaisons.


Bonne pratique - Uniformiser avant de comparer

Convertir systématiquement en minuscules avant de comparer deux chaînes (par exemple deux adresses email) évite de considérer "Alice@mail.com" et "alice@mail.com" comme deux valeurs différentes.

Étape 3 — Séparer prénom et nom avec explode()

Découpez $nomComplet ("alice dupont") en un tableau $parties de deux éléments, en utilisant l'espace comme séparateur.


Bonne pratique - Vérifier le nombre d'éléments obtenus

Après un explode(), il est prudent de vérifier avec count() que le tableau contient bien le nombre d'éléments attendu, au cas où l'utilisateur aurait saisi un nom composé de plus de deux mots.

Étape 4 — Extraire l'initiale du prénom avec substr()

En utilisant substr(), extrayez le premier caractère de $prenom et stockez-le dans $initiale.


Bonne pratique - Attention aux index

substr($chaine, 0, 1) extrait le tout premier caractère. Une erreur fréquente est d'oublier que les positions commencent à 0, comme pour les index de tableaux.

Étape 5 — Remplacer un mot interdit avec str_replace()

Un pseudo "admin123" a été saisi par erreur. Remplacez le mot "admin" par "utilisateur" dans cette chaîne.


Bonne pratique - Bloquer des mots réservés

Empêcher un utilisateur de choisir un pseudo contenant "admin" est une mesure de sécurité simple, qui évite des confusions ou des tentatives d'usurpation d'identité.

Étape 6 — Reconstruire un affichage avec implode()

Assemblez $initiale (suivie d'un point) et $nom (en majuscules) dans un tableau, puis utilisez implode() avec un espace comme séparateur pour obtenir "A. DUPONT".


Bonne pratique - Combiner plusieurs fonctions de chaînes

Il est courant de combiner plusieurs fonctions de chaînes pour produire un affichage propre. Découper le problème en petites étapes (comme dans ce TP) rend le code plus facile à comprendre et à corriger.

Une solution du TP

📌 Une solution