W3docs

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ètreDescription
$patternLe délimiteur sous forme d'expression régulière, avec délimiteurs comme /.../.
$subjectLa chaîne d'entrée à découper.
$limitNombre 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é.
$flagsMasque 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 :

php— editable, runs on the server

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 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 utilisez preg_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_EMPTY si vous ne les voulez pas.

Fonctions associées

Pratique

Pratique
Quel est le rôle de preg_split en PHP, et quand doit-on l'utiliser ?
Quel est le rôle de preg_split en PHP, et quand doit-on l'utiliser ?
Was this page helpful?