Vérifier le début d'une chaîne en PHP : toutes les méthodes et pièges à éviter

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

« Ma chaîne commence-t-elle par ce mot ? » — la question éternelle du développeur PHP

\n\n

Imaginez la situation : vous écrivez un analyseur d'URL, vous traitez des requêtes entrantes ou vous filtrez simplement une liste de fichiers. Et là, le problème se pose : vous devez vérifier si une chaîne commence par un ensemble spécifique de caractères. Cela semble simple, non ? Mais détrompez-vous. Jusqu'à récemment, PHP ne disposait pas de fonction intégrée pour cette opération pourtant basique. Les développeurs rivalisaient d'ingéniosité : certains découpaient la chaîne avec substr(), d'autres cherchaient la position avec strpos(), et d'autres encore s'aventuraient dans les méandres des expressions régulières.

\n\n

Dans cet article, nous allons passer en revue toutes les méthodes pour vérifier le début d'une chaîne en PHP. Vous apprendrez non seulement comment le faire « proprement » dans les versions modernes, mais aussi comment résoudre ce problème sur des projets « legacy » où PHP 5 est encore utilisé. C'est parti !

\n\n

La méthode la plus correcte : str_starts_with() (PHP 8.0+)

\n\n

Si votre projet fonctionne sous PHP 8.0 ou une version ultérieure, vous avez de la chance. Vous disposez de la fonction native str_starts_with(), qui fait exactement ce que son nom indique. Elle prend deux arguments : la chaîne source et la sous-chaîne que nous recherchons au début. Elle retourne true ou false.

\n\n
<?php\n$url = "https://pythonlib.ru/php-tutorial";\n\nif (str_starts_with($url, "https://")) {\n    echo "Lien sécurisé, nous utilisons HTTPS";\n} else {\n    echo "Attention ! Connexion non HTTPS";\n}\n// Affiche : Lien sécurisé, nous utilisons HTTPS\n?>
\n\n

Pourquoi est-ce la meilleure option ?

\n
    \n
  • Lisibilité — le code parle de lui-même. Pas besoin de commenter ce que fait cette ligne.
  • \n
  • Performance — la fonction est optimisée au niveau du code C de PHP. Elle est plus rapide que les vérifications manuelles.
  • \n
  • Sécurité — aucun problème avec les encodages multi-octets (sauf si vous travaillez avec UTF-8 d'une manière particulière, mais nous y reviendrons).
  • \n
\n\n

D'ailleurs, cette fonction a une « sœur jumelle » — str_ends_with(), qui vérifie la fin d'une chaîne. Mais c'est un sujet pour un autre article.

\n\n

Le grand classique : strpos()

\n\n

Avant l'apparition de str_starts_with(), la méthode la plus populaire était d'utiliser la fonction strpos(). Elle recherche la première occurrence d'une sous-chaîne dans une chaîne et retourne sa position (un nombre). Si la sous-chaîne n'est pas trouvée, elle retourne false.

\n\n

L'astuce est que si la sous-chaîne se trouve au tout début, sa position sera 0. Or, 0 en PHP est une valeur « falsy ». Par conséquent, la vérification doit être stricte :

\n\n
<?php\n$string = "Bonjour, le monde !";\n\nif (strpos($string, "Bonjour") === 0) {\n    echo "La chaîne commence par Bonjour";\n} else {\n    echo "Non, le début est différent";\n}\n?>
\n\n

Important ! Utilisez toujours l'opérateur de comparaison stricte ===, et non ==. Pourquoi ? Imaginez que vous cherchez une sous-chaîne qui n'existe pas. strpos() retournera false. Si vous écrivez strpos($string, "test") == 0, alors false == 0 donnera true (car PHP convertit les types). Votre code dira alors que la chaîne commence par "test", alors que ce n'est pas le cas. Un piège classique pour les débutants !

\n\n

Avantages et inconvénients de strpos()

\n
    \n
  • ✅ Fonctionne sur toutes les versions de PHP, depuis la 4.
  • \n
  • ✅ Ne nécessite pas l'installation d'extensions.
  • \n
  • ❌ Code moins lisible — il faut se souvenir de la comparaison stricte.
  • \n
  • ❌ En cas de mauvaise utilisation (sans ===), génère des bogues difficiles à détecter.
  • \n
\n\n

La méthode de grand-père : substr()

\n\n

Une autre méthode qui nous vient des profondeurs de l'histoire. L'idée est simple : extraire de la chaîne un morceau de la même longueur que la sous-chaîne recherchée, puis les comparer.

\n\n
<?php\n$filename = "rapport_2024.pdf";\n\n$prefix = "rapport_";\nif (substr($filename, 0, strlen($prefix)) === $prefix) {\n    echo "C'est le rapport pour 2024";\n} else {\n    echo "Ce n'est pas un rapport";\n}\n?>
\n\n

Avantages et inconvénients de substr()

\n
    \n
  • ✅ Fonctionne sur toutes les versions de PHP.
  • \n
  • ✅ Logique simple et claire.
  • \n
  • ❌ Moins performant que str_starts_with() — nécessite de calculer la longueur et de copier une partie de la chaîne.
  • \n
  • ❌ Code plus verbeux.
  • \n
\n\n

L'artillerie lourde : expressions régulières (preg_match)

\n\n

Parfois, vous devez vérifier non seulement un préfixe fixe, mais aussi un motif complexe. Par exemple, une chaîne doit commencer par une lettre, suivie de trois chiffres, puis d'un trait d'union. Dans ce cas, les expressions régulières viennent à la rescousse.

\n\n
<?php\n$code = "A123-xyz";\n\nif (preg_match("/^[A-Z]\d{3}-/", $code)) {\n    echo "Le format du code est correct";\n} else {\n    echo "Format incorrect";\n}\n// Affiche : Le format du code est correct\n?>
\n\n

Le symbole ^ dans l'expression régulière signifie « début de la chaîne ». C'est un point clé.

\n\n

Quand utiliser les expressions régulières ?

\n
    \n
  • Lorsque le motif de début est complexe et ne peut pas être décrit par une simple sous-chaîne.
  • \n
  • Lorsque vous devez non seulement vérifier, mais aussi extraire des parties du début de la chaîne.
  • \n
\n\n

Inconvénients :

\n
    \n
  • ❌ Plus lent que les fonctions spécialisées.
  • \n
  • ❌ Code moins lisible pour les débutants.
  • \n
  • ❌ Peut contenir des erreurs si l'expression régulière est mal écrite.
  • \n
\n\n

Piège n°1 : encodage et caractères multi-octets

\n\n

Toutes les méthodes ci-dessus (sauf str_starts_with()) fonctionnent au niveau des octets, et non des caractères. Cela signifie que si vous travaillez avec des chaînes UTF-8 contenant des caractères cyrilliques, chinois ou des emojis, vous risquez de rencontrer des problèmes.

\n\n

Par exemple, le caractère « é » en UTF-8 occupe 2 octets. Si vous utilisez substr() pour vérifier les 2 premiers octets, vous risquez de couper le caractère en deux, ce qui donnera un résultat incorrect.

\n\n

Solution : utiliser les fonctions mb_* (multi-byte) :

\n\n
<?php\n$string = "Café délicieux";\n\n// Version incorrecte (octets)\nif (substr($string, 0, 4) === "Café") {\n    echo "Commence par Café (octets)";\n}\n\n// Version correcte (caractères)\nif (mb_substr($string, 0, 4) === "Café") {\n    echo "Commence par Café (caractères)";\n}\n?>
\n\n

Pour strpos(), utilisez mb_strpos(). Pour les expressions régulières, ajoutez le modificateur u : preg_match("/^.../u", $string).

\n\n

Piège n°2 : espaces invisibles et caractères de contrôle

\n\n

Parfois, une chaîne peut sembler commencer par un certain mot, mais en réalité, elle contient des espaces invisibles, des tabulations ou des caractères de contrôle au début. Par exemple, si vous lisez des données depuis un fichier ou une API, des caractères BOM (Byte Order Mark) peuvent s'ajouter au début.

\n\n

Solution : avant de vérifier, nettoyez la chaîne avec trim() ou supprimez les caractères indésirables.

\n\n
<?php\n$dirty = "\\xEF\\xBB\\xBFBonjour"; // Chaîne avec BOM UTF-8\n\n// Nettoyage\n$clean = preg_replace("/^\\xEF\\xBB\\xBF/", "", $dirty);\n\nif (str_starts_with($clean, "Bonjour")) {\n    echo "Maintenant ça marche !";\n}\n?>
\n\n

Tableau comparatif des méthodes

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
MéthodeVersion PHP minimalePerformancePrise en charge UTF-8Lisibilité
str_starts_with()8.0★★★★★Oui (nativement)★★★★★
strpos() === 04.0★★★★☆Non (utiliser mb_strpos)★★★☆☆
substr() ===4.0★★★☆☆Non (utiliser mb_substr)★★★★☆
preg_match()4.0★★☆☆☆Avec modificateur u★★☆☆☆
\n\n

Conclusion : que choisir ?

\n\n

Résumons brièvement :

\n
    \n
  • Si vous utilisez PHP 8.0 ou supérieur — utilisez str_starts_with(). C'est la méthode la plus rapide, la plus lisible et la plus fiable.
  • \n
  • Si vous travaillez sur un projet legacy avec PHP 7 ou 5 — utilisez strpos() === 0 ou substr(). N'oubliez pas la comparaison stricte !
  • \n
  • Si vous travaillez avec des chaînes UTF-8 — utilisez les versions mb_* des fonctions.
  • \n
  • Si vous devez vérifier un motif complexe — utilisez les expressions régulières avec le modificateur u.
  • \n
\n\n

Et surtout, testez toujours votre code avec différents jeux de données, y compris les cas limites. Bonne chance dans votre développement !

Blogs

Book Recommendations