par
Hywan » 09 avr. 2008, 12:10
Puisque tu es décidé à ne pas utiliser les expressions régulières, je te montre comment ton problème peut être résolue en 2 lignes. Le but, c'est de te faire apprendre

.
Première expression, on sépare le smim du reste, indépendamment du nombre d'espace entre les deux parties :
Seconde expression, on éclate partie par partie la chaîne avec un motif qui se répète autour des && (séparateur des grosses parties) :
Code : Tout sélectionner
(.{7})([0-9]{12})/([a-zA-Z]{3})/([0-9]{6})/([a-zA-Z]{3})/([0-9]{4})(.{5})(.{14})\|\|([^&&]+)
L'avantage avec ton motif, c'est qu'il est simple, dans le sens où il est fixé. Chaque longueur des parties à éclater a une taille fixe (7 pour la boîte, puis 12 pour le téléphone, puis 3 pour le mois, puis 6 ...). Il n'y a que la dernière partie (que tu appelles $sauv) dont on ne connaît pas la taille. Mais ce n'est pas un soucis, on sait qu'elle occupe tout l'espace entre || et &&.
Donc voici un premier code réalisé en 13 min (chrono en main), en même temps que je déjeune :
<?php
header('Content-type: text/plain');
$var = 'smim Gekobox069945282806/Apr/200806/Apr/2008Bonne04345c69e70280||2&&Gekobox069945282806/Apr/200806/Apr/2008Mauva04345c69e70280||3';
function parse ( $var = '' ) {
if(0 === preg_match('#^smim\s*(.*)$#', $var, $tail))
return false;
if(0 === preg_match_all('#(.{7})([0-9]{12})/([a-zA-Z]{3})/([0-9]{6})/([a-zA-Z]{3})/([0-9]{4})(.{5})(.{14})\|\|([^&&]+)#',
$tail[1], $matches, PREG_SET_ORDER))
return false;
return $matches;
}
$result = parse($var);
if(false === $result)
echo 'Erreur, et toc !';
else
print_r($result);
Produira le résultat suivant :
Code : Tout sélectionner
Array
(
[0] => Array
(
[0] => Gekobox069945282806/Apr/200806/Apr/2008Bonne04345c69e70280||2
[1] => Gekobox
[2] => 069945282806
[3] => Apr
[4] => 200806
[5] => Apr
[6] => 2008
[7] => Bonne
[8] => 04345c69e70280
[9] => 2
)
[1] => Array
(
[0] => Gekobox069945282806/Apr/200806/Apr/2008Mauva04345c69e70280||3
[1] => Gekobox
[2] => 069945282806
[3] => Apr
[4] => 200806
[5] => Apr
[6] => 2008
[7] => Mauva
[8] => 04345c69e70280
[9] => 3
)
)
Tu vois que ton problème se résout effectivement en 2 lignes

.
J'espère que tu remarqueras que c'est autrement plus simple à écrire et à traiter que des substr sur explode sur des list de split ... et j'en passe.
Il faut voir le code comme un exemple pédagogique et pas comme : je te file le code tout chaud dans le bec

.
Puisque tu es décidé à ne pas utiliser les expressions régulières, je te montre comment ton problème peut être résolue en 2 lignes. Le but, c'est de te faire apprendre :).
Première expression, on sépare le smim du reste, indépendamment du nombre d'espace entre les deux parties : [code]^smim\s*(.*)$[/code]
Seconde expression, on éclate partie par partie la chaîne avec un motif qui se répète autour des && (séparateur des grosses parties) : [code](.{7})([0-9]{12})/([a-zA-Z]{3})/([0-9]{6})/([a-zA-Z]{3})/([0-9]{4})(.{5})(.{14})\|\|([^&&]+)[/code]
L'avantage avec ton motif, c'est qu'il est simple, dans le sens où il est fixé. Chaque longueur des parties à éclater a une taille fixe (7 pour la boîte, puis 12 pour le téléphone, puis 3 pour le mois, puis 6 ...). Il n'y a que la dernière partie (que tu appelles $sauv) dont on ne connaît pas la taille. Mais ce n'est pas un soucis, on sait qu'elle occupe tout l'espace entre || et &&.
Donc voici un premier code réalisé en 13 min (chrono en main), en même temps que je déjeune : [php]<?php
header('Content-type: text/plain');
$var = 'smim Gekobox069945282806/Apr/200806/Apr/2008Bonne04345c69e70280||2&&Gekobox069945282806/Apr/200806/Apr/2008Mauva04345c69e70280||3';
function parse ( $var = '' ) {
if(0 === preg_match('#^smim\s*(.*)$#', $var, $tail))
return false;
if(0 === preg_match_all('#(.{7})([0-9]{12})/([a-zA-Z]{3})/([0-9]{6})/([a-zA-Z]{3})/([0-9]{4})(.{5})(.{14})\|\|([^&&]+)#',
$tail[1], $matches, PREG_SET_ORDER))
return false;
return $matches;
}
$result = parse($var);
if(false === $result)
echo 'Erreur, et toc !';
else
print_r($result);[/php]
Produira le résultat suivant : [code]Array
(
[0] => Array
(
[0] => Gekobox069945282806/Apr/200806/Apr/2008Bonne04345c69e70280||2
[1] => Gekobox
[2] => 069945282806
[3] => Apr
[4] => 200806
[5] => Apr
[6] => 2008
[7] => Bonne
[8] => 04345c69e70280
[9] => 2
)
[1] => Array
(
[0] => Gekobox069945282806/Apr/200806/Apr/2008Mauva04345c69e70280||3
[1] => Gekobox
[2] => 069945282806
[3] => Apr
[4] => 200806
[5] => Apr
[6] => 2008
[7] => Mauva
[8] => 04345c69e70280
[9] => 3
)
)[/code]
Tu vois que ton problème se résout effectivement en 2 lignes :).
J'espère que tu remarqueras que c'est autrement plus simple à écrire et à traiter que des substr sur explode sur des list de split ... et j'en passe.
Il faut voir le code comme un exemple pédagogique et pas comme : je te file le code tout chaud dans le bec ;-).