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
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
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
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"
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
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";
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
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înesprint("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.
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.
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.
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.
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.
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".
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.