Menu

PHP substr() : extraire une partie d'une chaîne

substr($string, $offset, $length) renvoie une partie d'une chaîne. Positions négatives, premiers ou derniers caractères, mb_substr pour le japonais et les autres textes UTF-8, substr_count, et couper un texte avec des points de suspension.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

substr($string, $offset, $length) renvoie la partie de $string qui commence à la position $offset (comptée depuis 0) et fait $length caractères. substr('Hello world', 0, 5) renvoie "Hello". Omettez $length pour tout obtenir jusqu'à la fin.

substr() compte des octets. C'est la même chose que des caractères pour du texte anglais, mais pas pour le japonais, le chinois, les emoji ou les lettres accentuées. Pour ceux-là, utilisez mb_substr(), présentée plus bas.

Syntaxe

substr(string $string, int $offset, ?int $length = null): string
  • $offset est l'endroit où commencer. 0 est le premier caractère. Une valeur négative compte depuis la fin.
  • $length est le nombre d'octets à prendre (un octet vaut un caractère en texte ASCII simple). Une valeur négative en laisse autant à la fin. null (ou l'omettre) signifie « jusqu'à la fin ».

Position et longueur négatives : travailler depuis la fin

Une $offset négative commence à compter depuis la fin de la chaîne, donc -1 est le dernier caractère. Une $length négative s'arrête autant de caractères avant la fin.

substr($s, 0, -1) est la façon habituelle de supprimer le dernier caractère, par exemple une virgule finale laissée par une boucle.

Obtenir le premier ou le dernier caractère

Pour un seul octet, vous pouvez aussi indexer directement la chaîne. $s[0] est le premier caractère et, depuis PHP 7.1, $s[-1] le dernier.

Indexer une position qui n'existe pas affiche un warning, alors que substr() renvoie simplement une chaîne vide. Si la chaîne peut être vide, préférez substr().

Hors limites : une chaîne vide, pas false

Si $offset dépasse la fin de la chaîne, substr() renvoie "" en PHP 8. En PHP 7, elle renvoyait false, donc du code ancien qui teste === false ne fonctionne plus.

Texte japonais : utiliser mb_substr

L'UTF-8 stocke les kana et les kanji courants sur 3 octets chacun (les kanji rares comme 𠮷 et les emoji en prennent 4). substr() compte des octets, donc substr('こんにちは', 0, 3) ne renvoie que こ, et une longueur qui ne tombe pas sur une limite de caractère coupe un caractère en deux et produit du texte cassé. mb_substr() prend les mêmes arguments et compte des caractères.

C'est pareil pour les emoji et les lettres accentuées comme é. Pour compter des caractères, utilisez mb_strlen() ; voir strlen() pour la différence entre octets et caractères.

Raccourcir un texte avec des points de suspension

Couper un long titre pour une liste ou une carte est l'usage réel le plus courant de substr(). Utilisez mb_substr() pour qu'un titre japonais ne soit jamais coupé au milieu d'un caractère, et n'ajoutez ... que si vous avez vraiment raccourci quelque chose.

mb_strimwidth($text, 0, $width, '...') fait la même chose selon la largeur d'affichage, où un caractère japonais pleine chasse compte pour 2 colonnes et une lettre latine pour 1. Elle convient aux mises en page à largeur fixe.

Compter une sous-chaîne avec substr_count

substr_count($haystack, $needle) renvoie combien de fois $needle apparaît. Elle est sensible à la casse et ne compte pas les correspondances qui se chevauchent.

substr avec strpos : le texte avant ou après un caractère

Combinez substr() avec strpos() pour couper à un caractère dont vous ne connaissez pas la position à l'avance, comme le @ d'une adresse email :

Vérifiez que strpos() n'a pas renvoyé false avant d'utiliser son résultat : si le caractère manque, false est traité comme 0 sans warning, donc substr('nobody', 0, $at) renvoie "" et substr('nobody', $at + 1) renvoie "obody".

Questions fréquentes

Comment obtenir les derniers caractères d'une chaîne en PHP ?

Utilisez une position négative : substr($s, -3) renvoie les 3 derniers caractères. Pour un texte qui peut contenir du japonais ou d'autres caractères multioctets, utilisez mb_substr($s, -3).

Quelle est la différence entre substr et mb_substr ?

substr() compte des octets et mb_substr() des caractères. En UTF-8, les kana et les kanji courants occupent 3 octets chacun, donc substr('日本語', 0, 2) coupe un caractère en deux, alors que mb_substr('日本語', 0, 2) renvoie "日本".

Que renvoie substr si le début dépasse la fin de la chaîne ?

Une chaîne vide. Depuis PHP 8.0, substr('abc', 5) renvoie "" ; PHP 7 renvoyait false.

Comment supprimer le dernier caractère d'une chaîne en PHP ?

substr($s, 0, -1) renvoie tout sauf le dernier octet. Utilisez mb_substr($s, 0, -1) pour du texte multioctet, ou rtrim($s, ',') si vous voulez seulement retirer un caractère final précis.

Comment compter combien de fois une sous-chaîne apparaît en PHP ?

substr_count($haystack, $needle) : substr_count('banana', 'an') renvoie 2. Elle est sensible à la casse et ne compte pas les correspondances qui se chevauchent.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER