preg_split
En PHP, preg_split() découpe une chaîne en tableau de sous-chaînes à l'aide d'une expression régulière comme délimiteur.
Introduction
preg_split() découpe une chaîne en un tableau de sous-chaînes en utilisant une
expression régulière pour décrire le délimiteur. C'est la version regex de
explode() : là où explode() ne peut découper que sur une
seule chaîne fixe, preg_split() peut découper sur un motif — toute suite
d'espaces, un ensemble de caractères de ponctuation, une frontière numérique, etc.
Cette page couvre la signature de la fonction, chaque drapeau, la valeur de retour et les cas d'usage pratiques (ainsi que les pièges) que vous rencontrerez en l'utilisant dans du code réel.
Syntaxe
preg_split(
string $pattern,
string $subject,
int $limit = -1,
int $flags = 0
): array|false| Paramètre | Description |
|---|---|
$pattern | Le délimiteur sous forme d'expression régulière, avec délimiteurs comme /.../. |
$subject | La chaîne d'entrée à découper. |
$limit | Nombre maximum de morceaux. -1 (valeur par défaut) ou 0 signifie aucune limite. Quand il est défini, le dernier morceau contient le reste non découpé. |
$flags | Masque de bits des constantes PREG_SPLIT_* (voir ci-dessous). Combinez-les avec ` |
La fonction retourne un tableau de sous-chaînes en cas de succès, ou false si
le motif est invalide. Elle ne lève jamais d'exception — vérifiez false (et
consultez preg_last_error()) si un découpage peut échouer.
Un exemple basique
Un cas d'usage classique est le découpage d'une chaîne sur un délimiteur variable — ici, toute suite d'espaces ou de virgules :
Le motif [\s,]+ correspond à un ou plusieurs caractères d'espace ou virgule, de
sorte que les espaces et la virgule agissent tous comme délimiteurs :
Array
(
[0] => This
[1] => is
[2] => a
[3] => test
[4] => string
)Comme + est gourmand, les délimiteurs consécutifs (une virgule et un espace) se
regroupent en un seul point de découpage plutôt que de produire des morceaux vides.
Les drapeaux
PREG_SPLIT_NO_EMPTY
Sans ce drapeau, un délimiteur au tout début ou à la fin de la chaîne — ou deux
délimiteurs consécutifs que le motif ne peut pas fusionner — produit des chaînes
vides dans le résultat. PREG_SPLIT_NO_EMPTY les supprime :
<?php
$string = ',apple,,banana,';
// Without the flag: empty pieces appear.
print_r(preg_split('/,/', $string));
// With the flag: only real values remain.
print_r(preg_split('/,/', $string, -1, PREG_SPLIT_NO_EMPTY));Le premier appel donne ['', 'apple', '', 'banana', ''] ; le second donne
['apple', 'banana'].
PREG_SPLIT_DELIM_CAPTURE
Si le motif contient des groupes capturants, ce drapeau inclut le texte capturé dans le résultat — utile quand vous souhaitez conserver les délimiteurs au lieu de les supprimer :
<?php
$expression = '3+5*2-9';
$tokens = preg_split('/([+\-*\/])/', $expression, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($tokens);Le résultat conserve à la fois les nombres et les opérateurs :
['3', '+', '5', '*', '2', '-', '9'] — exactement ce dont un petit tokeniseur
d'expressions a besoin.
PREG_SPLIT_OFFSET_CAPTURE
Chaque élément devient une paire [$substring, $offset], où $offset est la
position en octets dans la chaîne d'origine. Pratique quand vous devez savoir où
provient chaque morceau.
Limiter le nombre de découpages
$limit plafonne le nombre de morceaux retournés ; le dernier élément conserve le
reste de la chaîne non découpé. C'est la façon idiomatique de découper « les N
premiers champs, puis tout le reste » :
<?php
$logLine = 'ERROR 2024-01-01 Something broke: details here';
// Split into at most 3 parts on whitespace.
$parts = preg_split('/\s+/', $logLine, 3);
print_r($parts);Cela produit ['ERROR', '2024-01-01', 'Something broke: details here'] — le
troisième élément conserve ses espaces internes car la limite a été atteinte.
preg_split() vs explode()
Préférez explode() quand le délimiteur est une seule chaîne
fixe — c'est plus rapide et plus clair. Préférez preg_split() quand le délimiteur
est un motif : espaces variables, un choix de caractères, une correspondance
insensible à la casse, ou quand vous devez conserver les délimiteurs via
PREG_SPLIT_DELIM_CAPTURE. Pour réassembler un tableau en chaîne, utilisez
implode().
Pièges courants
- Oublier les délimiteurs du motif. Le premier argument est une regex complète,
donc il nécessite des délimiteurs :
'/,/', et non','. Passer une chaîne brute est l'erreur la plus fréquente chez les débutants. - Caractères spéciaux non échappés. Les caractères comme
.,+,|et*sont des métacaractères regex. Pour découper sur un point littéral, échappez-le ('/\./') ou utilisezpreg_quote()sur des entrées dynamiques. - Chaînes vides parasites. Les délimiteurs en début/fin de chaîne créent des
morceaux vides — ajoutez
PREG_SPLIT_NO_EMPTYsi vous ne les voulez pas.
Fonctions associées
explode()— découper sur un délimiteur de chaîne fixe.implode()— rejoindre un tableau en une chaîne.preg_match()/preg_match_all()— trouver des correspondances au lieu de découper.preg_replace()— remplacer du texte par motif.