Prenons par exemple la chaine suivante :

AA;BBB;CC\;CC;DD

Si nous voulons spliter cette chaine avec comme séparateur le ; afin d'obtenir les chaines suivantes :

AA
BBB
CC\;CC
DD

on s'aperçoit qu'il va falloir tenir compte dans l'expression rationnelle du fait que le séparateur ; peut être précédé du caractère d'échappement \ .

Pour cela, il va nous falloir utiliser une assertion, et plus précisément une assertion arrière négative.

Une assertion est un test sur les caractères suivants ou précédents celui qui est en cours d'étude.

Une assertion arrière négative commence par (?<! et permet de s'assurer que le caractère en cours d'étude n'est pas précédé par le sous-masque défini par l'assertion. Dans notre cas, cela nous permet de repérer les caractères ; qui ne sont pas précédés du caractère \ .

L'expression rationnelle résultante est donc :

(?<!\\);

Ce qui nous donne le code PHP suivant :

$str = 'AA;BBB;CC\;CC;DD';
$splited = preg_split('/(?<!\\\);/', $str);

(noter les 3 \ car en PHP l'antislash est aussi un caractère d'échappement, et il faut doubler le premier pour qu'au final l'expression rationnelle en comporte 2)

En savoir plus :