Page 1 sur 1

preg_match, espacer chaîne

Posté : 07 oct. 2006, 17:42
par Arguin
Bonjour,

Je voudrais formater un numéro de téléphone, saisi dans un formulaire, avant de l'insérer dans une table MySql.

Dans mon formulaire, mes visiteurs sont libres de saisir leur numéro sous la forme "XXXXXXXXXX" ou XX XX XX XX XX ou "XX-XX-XX-XX-XX", voire "XX.XX.XX.XX.XX"

Soit, par exemple, le numéro d'appel suivant : 01 42 92 81 00 (c'est celui de la présidence de la République pour les plaisantins :) ). Je voudrais l'enregistrer sous "01-42-92-81-00".

L'ancien code, assez crasseux (!), que j'utilisais était le suivant :
<?php
$telephone = str_replace('-','', $telephone );
$telephone = str_replace('.','', $telephone );
$telephone = str_replace(' ','', $telephone );
 {
$telephone  = $telephone {0}.$telephone {1}.'-'.$telephone {2}.$telephone {3}.'-'.$telephone {4}.$telephone {5}.'-'.$telephone {6}.$telephone {7}.'-'.$telephone {8}.'-'.$telephone {9};
}
?>
A présent, j'essaie de me mettre aux expressions régulières.

J'ai donc produit le code suivant :
<?php
$telephone=preg_replace("#^([\d]{2})([-. ])([\d]{2})([-. ])([\d]{2})([-. ]{1})([\d]{2})([-. ])([\d]{2})$#",'$1-$3-$5-$7-$9',$telephone); 
?>
L'expression preg_replace fonctionne, sauf lorsque le numéro est saisi d'un bloc, c'est-à-dire sous la forme 0142928100 : il n'est pas formaté. J'ai essayé d'ajouter des "?" ou des {0,1} pour rendre les symboles [-. ] facultatifs, sans résultat...

Aurai-je oublié quelque chose ou le formatage est-il impossible avec une expression régulière ?

J'ai consulté l'excellent tutoriel de Ripat, mais il ne m'a pas éclairé.

Merci bien.

Cordialement,

:lol:

A.

Posté : 07 oct. 2006, 18:24
par Ripat
Bonjour,

Les solutions regex à ton problème sont multiples. Par exemple:
echo '<pre>';

$numeros = array(
  '01 42 92 81 00',
  '01.42.92.81.00',
  '0142928100',
  '01-42-92-81-00'
);

print_r($numeros);

$motif = '#(\d\d)(?: |-|\.)?(?<!$)#';
$rplce = '$1-';
print_r(preg_replace($motif, $rplce, $numeros));
Le motif:
(\d\d) chaque groupe de deux numériques sont capturés si suivis par...
(?: |-|\.)? un espace, un tiret, un point ou... rien (ce groupe, non capturant, d'alternatives est rendu optionnel par le ?) NON suivis par
(?<!$) assertion arrière négative c-à-d non suivi par la fin de chaîne.

Si tu dois traiter un très grand nombre de numéros en une fois, il serait sans doute plus efficace de d'abord enlever les caractères indésirables par un str_replace(), et ensuite faire un preg_replace() plus simple:
$motif = '#(\d\d)(?<!$)#';