Résumé depuis f.c.l.php :
========= Etienne SOBOLE a écrit :
>
> je cherche l'expression regulière qui compte un motif précis répété
> successivement du genre :
> abcx2x2x2x2x2x2pq
> je cherche à compter les motif x2
>
> j'aimerai transformer cette chaine en
> abc#6pq
> indiquant pas là que j'ai 6 fois le motif recherché!
>
> voila.
> ca se fait ca avec une expression régulière ???
======== SAM
sans expression régulière :
<http://cjoint.com/?hnbIeQxTmD>
========= Le 12/07/2008 12:55, Etienne SOBOLE a écrit :
>>
>> En fait j'utilise json coté javascript et json_decode cote php.
>>
>> le problème est que si en javascript j'ai un truc genre
>> var tData = [];
>> tData[5] = 10;
>>
>> la serialisation json va me donner un truc genre
>> [null,null,null,null,null,10]
>> ce que je souhaite faire c'est remplacer ca par
>> [@N5_10]
>> afin de réduire le flot de données a envoyer.
====== SAM
Je le fais sans expression régulière :
function compacter(tableau) {
var n = 0;
while(n<tableau.length && tableau[n]==null) n++;
return '@N'+n+'_'+tableau[n];
}
alert(compacter(tData));
======== Etienne SOBOLE a écrit :
>
> Interessant,
> mais j'ai opté pour une méthode plus globale travaillant sur la chaine
> une fois sérialisée, car la structure que je renvoie est trop complexe
> pour que je m'amuse a chercher tous les tableaux.
> Ça donne :
>
> var expr = /(null,)+/
> var tRes = expr.exec(sDossier);
> while (tRes)
> {
> var sDossier = sDossier.replace(expr,
"@N" + (tRes[0].length / tRes[1].length) + "@");
> var tRes = expr.exec(sDossier);
> }
>
> et ca remplace une liste de null, par @Nx@
> où x est le nombre de "null," consécutifs trouvés !
========= Olivier Miakinen a écrit :
>
> Bon, voici une proposition en PHP,
> tu peux l'adapter pour y mettre les caractères que tu veux à la place
> de '#'.
> ---------------------------------------------------------------------
> <?php
> header("Content-Type: text/plain");
>
> function repnull($matches)
> {
> $count = strlen($matches[0]) / 5;
> return '#' . $count . substr($matches[0], -1);
> }
> function dorepnull($subject)
> {
> return preg_replace_callback('/(?<=[[,])(null,)*null[],]/',
> 'repnull', $subject);
> }
> $a = '[null,null,null,null,null]';
> $b = '[a,null,b,null,null,c,null,d]';
> $c = '[nullard,annulle,null,tronull,"null",null,nul]';
> echo $a . "\n-> " . dorepnull($a) . "\n";
> echo $b . "\n-> " . dorepnull($b) . "\n";
> echo $c . "\n-> " . dorepnull($c) . "\n";
> ?>
> ---------------------------------------------------------------------
>
> Le résultat de l'exécution est :
> ---------------------------------------------------------------------
> [null,null,null,null,null]
> -> [#5]
> [a,null,b,null,null,c,null,d]
> -> [a,#1,b,#2,c,#1,d]
> [nullard,annulle,null,tronull,"null",null,nul]
> -> [nullard,annulle,#1,tronull,"null",#1,nul]
> ---------------------------------------------------------------------
========= Olivier Miakinen a écrit :
>
> Tiens, il semblerait que ce soit possible en JavaScript aussi depuis
> la version 1.3 :
>
<http://developer.mozilla.org/fr/docs/R%C3%A9f%C3%A9rence_de_JavaScript_1.5_Core:Objets_globaux:String:replace#Exemple_:_utilisation_d.27une_fonction_inline_modifiant_les_caract.C3.A8res_trouv.C3.A9s>
>
> Donc :
>
> sujet.replace('/(?<=[[,])(null,)*null[],]/',
> function(match) {
> count = strlen(match)/5;
> last = match.substring(strlen(match)-1);
> return '#' + count + last;
> });
>
> (non testé)
à mon idée ce devrait être plus proche de :
function dorepnull(sujet) {
sujet = sujet.replace(/(?<=[[,])(null,)*null[],]/,
function(match) {
return '#' + match.length/5 + match.substring(match.length-1);
});
return sujet;
}
alert(dorepnull($b));
Bon ... ça marche pô :-(
Erreur : invalid quantifier ?<=[[,])(null,)*null[],]
Code Source :
sujet = sujet.replace(/(?<=[[,])(null,)*null[],]/,
--
sm