Pourquoi vérifier le début et la fin d'une chaîne en PHP ?
\n\nImaginez : vous écrivez un site en PHP et vous devez vérifier si le nom de fichier se termine par .jpg ? Ou si l'email commence par admin ? Avant, il fallait utiliser des bricolages avec substr() ou des expressions régulières. Mais depuis PHP 8.0, nous avons une solution élégante — les fonctions str_starts_with() et str_ends_with().
Ce n'est pas simplement du sucre syntaxique. Ce sont des moyens rapides, lisibles et sûrs de travailler avec les chaînes, que tout développeur PHP devrait connaître. Dans cet article, nous les analyserons avec des exemples concrets, les comparerons aux anciennes approches et montrerons comment éviter les erreurs typiques.
\n\nQue sont str_starts_with et str_ends_with ?
\n\nLes deux fonctions sont apparues dans PHP 8.0 (sorti en novembre 2020). Elles résolvent une tâche simple : vérifier si une chaîne contient un préfixe (début) ou un suffixe (fin) donné.
\n\nSignature des fonctions
\n\nstr_starts_with(string $haystack, string $needle): bool\nstr_ends_with(string $haystack, string $needle): bool\n\n- \n
$haystack— la chaîne dans laquelle on cherche (la botte de foin). \n $needle— la sous-chaîne que l'on cherche (l'aiguille). \n - Retournent
trueoufalse. \n
Exemple simple
\n\necho str_starts_with('Bonjour, le monde !', 'Bonjour'); // true\necho str_ends_with('Bonjour, le monde !', 'monde !'); // true\necho str_starts_with('Bonjour, le monde !', 'monde'); // false\n\nImportant : les fonctions sont sensibles à la casse. str_starts_with('PHP', 'php') retournera false. Si vous avez besoin d'une comparaison insensible à la casse, utilisez strtolower() ou strtoupper() sur les deux chaînes.
Exemples concrets d'utilisation
\n\n1. Vérification de l'extension de fichier
\n\n$filename = 'rapport_2024.pdf';\n\nif (str_ends_with($filename, '.pdf')) {\n echo "C'est un document PDF";\n} elseif (str_ends_with($filename, '.jpg')) {\n echo "C'est une image";\n} else {\n echo "Format inconnu";\n}\n\nAvant, cela se faisait avec substr($filename, -4) — facile de se tromper sur la longueur du suffixe. Maintenant, le code se lit comme un anglais courant : « la chaîne se termine par ».
2. Validation d'URL ou d'email
\n\n$email = 'utilisateur@gmail.com';\n$url = 'https://pythonlib.ru';\n\nif (str_ends_with($email, '@gmail.com')) {\n echo "Utilisateur Gmail";\n}\n\nif (str_starts_with($url, 'https://')) {\n echo "Connexion sécurisée";\n}\n\n3. Filtrage d'un tableau de chaînes
\n\n$files = ['image.jpg', 'document.pdf', 'photo.png', 'notes.txt'];\n\n$images = array_filter($files, function($file) {\n return str_ends_with($file, '.jpg') || str_ends_with($file, '.png');\n});\n\nprint_r($images); // ['image.jpg', 'photo.png']\n\nComment cela fonctionnait avant (et pourquoi les nouvelles fonctions sont meilleures)
\n\nAvant PHP 8.0, les développeurs utilisaient plusieurs approches. Comparons-les avec les nouvelles fonctions.
\n\nMéthode 1 : substr()
\n\n// Ancienne méthode : vérification du début\nif (substr($string, 0, strlen('prefix')) === 'prefix') { ... }\n\n// Nouvelle méthode\nif (str_starts_with($string, 'prefix')) { ... }\n\nInconvénients de l'ancienne méthode :
\n- \n
- Verbeux : il faut calculer la longueur de la sous-chaîne. \n
- Risque d'erreur avec une longueur négative (si
$needleest plus long que$haystack). \n - Code moins lisible. \n
Méthode 2 : strpos()
\n\n// Ancienne méthode : vérification du début\nif (strpos($string, 'prefix') === 0) { ... }\n\n// Nouvelle méthode\nif (str_starts_with($string, 'prefix')) { ... }\n\nAvec strpos, il est facile de commettre une erreur logique : si on n'utilise pas === 0, mais simplement == false ou == 0