Post by SAMPost by Olivier MiakinenS'il y en a que ça intéresse (toi ou quelqu'un d'autre) je peux
expliquer pourquoi ça marche.
Ben moi, par exemple.
Et non seulement "pourquoi" mais "comment"
Allons-y, et je vais commencer par l'expression régulière :
/(?<=[[,])(null,)*null[],]/
Tout d'abord, je suppose que tout le monde connaît les classes de
caractères, qui représentent toujours *un* caractère choisi parmi
plusieurs. Par exemple [0123456789] représente un chiffre de 0 à 9,
mais [0-9] représente la même chose. On voit que le caractère '-'
est spécial dans une classe de caractères, et si on veut l'inclure
il faut le mettre au début [-0-9] ou à la fin [0-9-]. Mais le
caractère ']' est spécial lui aussi ! Si on veut l'inclure, on ne
peut le mettre qu'au début : []0-9].
Ainsi, « [],] » est la classe de caractères qui représente soit un
crochet ']' soit une virgule ','. Quant à « [[,] », il représente
soit un crochet '[' soit une virgule ','.
Je ne ferai pas l'affront d'expliquer '*', et il peut rester un seul
truc un peu mystérieux : « (?<= <quelque chose> ) ». Il s'agit d'une
assertion positive arrière (positive lookbehind assertion) qui vérifie
que la chaîne en question se trouve bien avant celle que l'on veut
récupérer, mais sans la récupérer. Ainsi, (?<=,)null, trouvera bien
« null, » dans « ,null, » mais pas dans « ,tronull, ».
Au final, /(?<=[[,])(null,)*null[],]/ trouvera :
null,
null]
null,null,
null,null]
null,null,null,
null,null,null]
null,null,null,null,
null,null,null,null]
et ainsi de suite, mais *seulement* après une virgule ou un crochet ouvrant.
Vu que j'utilise preg_replace_callback, le résultat du match sera envoyé
à la fonction repnull, qui trouve le match complet dans $matches[0] et
le contenu d'éventuelles parenthèses captruantes dans $matches[1], etc.
(mais je ne m'en sers pas). Mettons qu'elle reçoive par exemple la
chaîne "null,null]", de longueur 10. Le nombre de null est 10/5 = 2,
calculé par :
$count = strlen($matches[0]) / 5;
Je rajoute '#' devant, et derrière je veux rajouter ',' ou ']' selon ce
qu'il y avait au départ, ce qui se fait par substr($matches[0], -1).
Dans ce cas précis :
'#' . $count . substr($matches[0], -1)
vaut :
'#' . 2 . ']'
Et voilà !
Post by SAMque devient le $matches de repnull($matches)
dans dorepnull($subject) ?
Il est remplacé par la chaîne envoyée en retour de repnull(). Ainsi,
"null,null]" est remplacé par "#2]".
Post by SAMMais où donc es-tu aller dénicher ce 'preg_replace_callback' ?
(doit quand même falloir fouiller pour trouver cette fonction !)
La fouille n'est pas bien longue, car la doc est bien faite de ce point
de vue-là. Par exemple, sur la page <http://fr.php.net/preg_replace> tu
vois dans la colonne de gauche toutes les fonctions apparentées :
# preg_grep
# preg_last_error
# preg_match_all
# preg_match
# preg_quote
# preg_replace_callback
# preg_replace
# preg_split
Il suffit d'un clic pour visiter la doc de chacune.
Post by SAMJe ne vois même pas la différence entre : 'preg_split' et 'explode' :-(
'explode' ne traite que des chaînes statiques, 'preg_split' des
expressions régulières. Je crois que JavaScript a une seule fonction
pour cela, mais c'est grace au fait qu'il existe un type RegExp, non ?
Post by SAM/(?<=[[,])(null,)*null[],]/
en particulier : [] (pourquoi ce n'est pas \[\] ?)
Parce que je ne cherche pas une séquence de *quatre* caractères "[],]"
mais *un* seul caractère qui est soit "]" soit ",".
Post by SAMdans : *null[],]/ (comment l'expression repère les bons crochets ?)
mais aussi : (?<=[[,])
Cf. les explications ci-dessus à propos des classes de caractères.
Cordialement,
--
Olivier Miakinen