8791 sujets

Développement web côté serveur, CMS

Bonjour à tous.

Un numéro de téléphone correctement écrit et bien présenté fait partie de ces petites choses qui agrémentent la vie lorsqu'on se retrouve sur un formulaire de saisie. Il existe par contre de multiples formats.

J'ai commencé une routine pour mes principaux pays clients. Comment l'améliorer pour la rendre plus rapide à écrire, et plus rapide à s'afficher ? On constate en effet de nombreuses répétitions au niveau logique.

Merci pour votre aide.

<!DOCTYPE html>
<html lang="fr">
<head>
	<meta charset="utf-8" />
	<title></title>
	<meta name="description" content="" />
	<meta name="keywords" lang="fr" content="" />
	<meta name="robots" content="noindex, follow" />
</head>
<body>
<?
$envoi = htmlentities($_SERVER['PHP_SELF']);
$form = <<<EOF
	<form action="$envoi" method="post" name="commande">
		<fieldset>
			<legend>Numéro de téléphone</legend>
			<p title="Sélectionnez votre pays.">
				<label for="pays" title="Sélectionnez votre pays.">Pays&nbsp;:</label>
				<select name="pays" id="pays" title="Sélectionnez votre pays." class="rouge">
					<option value="Inconnu">Sélectionner un pays</option>
					<option value="Belgique">Belgique</option>
					<option value="Canada">Canada</option>
					<option value="France">France</option>
					<option value="Suisse">Suisse</option>
				</select>
			</p>
			<p title="Indiquez votre numéro de téléphone.">
				<label for="fixe">Téléphone fixe&nbsp;:</label>
				<input type="tel" name="fixe" value="" placeholder="Champ obligatoire" id="fixe" required="required" />
			</p>
			<p>
				<input type="submit" name="envoyer" id="envoyer" value="Valider" />
			</p>
		</fieldset>
	</form>
EOF;
$test=null;
if (!isset($_POST['envoyer'])):
	echo $form;
else:
	if (!empty($_POST['fixe'])):
		$item=trim(strip_tags(stripslashes($_POST['fixe'])));
		if (!empty($_POST['pays'])): // supression des "-", ".", " ", et "(0))"
				$item = str_replace('-', '', $item);
				$item = str_replace('.', '', $item);
				$item = str_replace(' ', '', $item);
				$item = str_replace('(0)', '', $item);
			if ($_POST['pays']=="Belgique"): // supression de l'indicatif'
				$item = str_replace('+32', '0', $item);
				$item = str_replace('32+', '0', $item);
				if(strlen($item) == 9): // test de conformité de longueur et mise au format
					$item = '+32 '.substr($item,1,2).' '.substr($item,3,2).' '.substr($item,5,2).' '.substr($item,7,2);
				else: // longueur incorrecte, on arrête tout
						$erreur[]='Téléphone fixe erroné';
						$test+=1;
				endif;
			endif;
			if ($_POST['pays']=="Canada"):
				$item = str_replace('+1', '0', $item);
				$item = str_replace('1+', '0', $item);
				if(strlen($item) == 10):
					$item = '+1 '.substr($item,0,3).' '.substr($item,3,4).'-'.substr($item,7,4);
				else:
						$erreur[]='Téléphone fixe erroné';
						$test+=1;
				endif;
			endif;
			if ($_POST['pays']=="France"):
				$item = str_replace('+33', '0', $item);
				$item = str_replace('33+', '0', $item);
				if(strlen($item) == 10):
					$item = substr($item,0,2).' '.substr($item,2,2).' '.substr($item,4,2).' '.substr($item,6,2).' '.substr($item,8,2);
				else:
						$erreur[]='Téléphone fixe erroné';
						$test+=1;
				endif;
			endif;
			if ($_POST['pays']=="Suisse"):
				$item = str_replace('+41', '0', $item);
				$item = str_replace('41+', '0', $item);
				if(strlen($item) == 10):
					$item = '+41 '.substr($item,1,2).' '.substr($item,3,3).' '.substr($item,6,2).' '.substr($item,8,2);
				else:
						$erreur[]='Téléphone fixe erroné';
						$test+=1;
				endif;
			endif;
		endif;
		$form=str_replace('name="fixe" value=""','name="fixe" value="'.$item.'"',$form);
	endif;
endif;
if ($test<>0):
	// Affichage des rubriques manquante
	if($test==1):
		echo '<p>Il reste '.$test.' rubrique à traiter : ';
	else:
		echo '<p>Il reste '.$test.' rubriques à traiter : ';
	endif;
	// Affichage d'un message général
	foreach($erreur as $element)
	{
		echo $element.'&nbsp;; ';
	}
	echo ' etc.</p>';
	// Réaffichage du formulaire pour correction
	echo $form;
else:
	if($_POST['fixe']<>''):
?>
	<p>Téléphone fixe : <? echo $_POST['fixe'];?></p>
<?
	endif;
	// Réaffichage du formulaire pour correction
	echo $form;
endif;
?>
</body>
</html>

Modifié par Pyanepsion (02 Jul 2012 - 08:40)
Salut,

Moi je stock les contraintes dans la table ou je gére les différents pays, mais ça peut se faire avec un simple tableau.

j'ai 5 champs:

int_phone_code => indicatif international
nat_phone_code => indicatif national
num_phone_digits => nombre de chiffres dans le numéro de téléphone fixe
num_mobile_digits => nombre de chiffres dans le numéro de portable
outcall_num => prefix appel international

Ensuite, je construit ma regexp a partir de ça:


$country = 'france';
$num_tel = '0474121314';

$phone_formats = array(
  'belgique' => array(
    'int_phone_code' => '32',
    'nat_phone_code' => '0',
    'num_phone_digits' => '8',
    'num_mobile_digits' => '9',
    'outcall_num' => '00'
  )
  'france' => array(
    'int_phone_code' => '33',
    'nat_phone_code' => '0',
    'num_phone_digits' => '9',
    'num_mobile_digits' => '9',
    'outcall_num' => '00'
  )
);

$cur_format = $phone_formats[$country];

preg_match('#^(\+'. $cur_format['int_phone_code'] .'|'. $cur_format['nat_phone_code'] .'|'. $cur_format['outcall_num'] . $cur_format['int_phone_code'] .')([0-9]{'. $cur_format['num_phone_digits'] .'})$#', $num_tel, $matches);

var_dump($matches);


Si tu change et que tu met belgique comme pays, ça ne validera plus (seulement 8 digits dans leurs numéros de fixe)

Pour pousser plus loin, tu peut stocker les indicatifs par région, ceux des portables, etc... moin j'ai tout ça dans ma BDD et des routines le gère a l'enregistrement.

Il y a des articles très intéressants sur le net expliquant comment sont formés les numéros de téléphone, car c'est loin d'être simple Smiley langue
Modifié par JJK801 (02 Jul 2012 - 10:11)
J'ai pu me rendre compte que c'était effectivement bien compliqué. Merci JJK801 pour ces nouvelles pistes. Smiley biggrin

Ton tableau ne gère pas les formats de présentation, alors que les gens aiment en principe bien voir leur numéro correctement affiché lors de la vérification d'un formulaire... et ça évite les appels : mon numéro est mal écrit. Ha non, pardon.

Voici donc une suggestion d'amélioration de ta table :
Belgique : +32 CC CC CC CC
Canada : +1 CCC CCC-CCCC
France : +33 C CC CC CC CC
Suisse : +41 CC CCC CC CC
Pyanepsion a écrit :
J'ai pu me rendre compte que c'était effectivement bien compliqué. Merci JJK801 pour ces nouvelles pistes. Smiley biggrin

Ton tableau ne gère pas les formats de présentation, alors que les gens aiment en principe bien voir leur numéro correctement affiché lors de la vérification d'un formulaire... et ça évite les appels : mon numéro est mal écrit. Ha non, pardon.

Voici donc une suggestion d'amélioration de ta table :
Belgique : +32 CC CC CC CC
Canada : +1 CCC CCC-CCCC
France : +33 C CC CC CC CC
Suisse : +41 CC CCC CC CC


Pour ça, je stock 2 formats dans ma base de donnée:

- Format d'entrée: Regex Pattern correspondant au découpage du numéro sérialisé
- Format de sortie: Regex Output correspondant au modèle de formatage

Pour le canada dans ton exemple ça donnerai:


$pattern_input = '/^(\+1)([0-9]{3})([0-9]{3})([0-9]{4})$/';
$pattern_output = '$1 $2 $3-$4';
$num_format = preg_replace($pattern_input, $pattern_output, $num);


Ma fonction est bien plus complexe mais c'est l'idée.

Edit: j'avais oublié le \ devant le +
Modifié par JJK801 (02 Jul 2012 - 12:05)
Voilà donc de quoi alimenter de belles nuits bien passionnantes en perspective. Merci. Smiley biggrin
Modifié par Pyanepsion (02 Jul 2012 - 11:56)
C'est toujours la même procédure pour le développement:

-Compréhension de la problématique
-Compréhension des outils
-Recherche de la meilleur solution

dans ce cas précis:

-Compréhension de la logique des formats téléphoniques
-Compréhension des expressions régulières
-Création d'un système de formatages avec des expressions réguliéres

Si tu décortique ce que j'ai écrit précédemment, c'est logique.

Chaque parenthèse dans l'expression correspond a un élément numéroté (par ordre d'arrivé dans l'expression), donc:

(\+1) = $1 = la chaine de caractère "+1"
([0-9]{3}) = $2 = une série de 3 chiffres = CCC
([0-9]{3}) = $3 = une série de 3 chiffres = CCC
([0-9]{4}) = $4 = une série de 4 chiffres = CCCC

Ensuite on recolle le tout, avec le format qu'on veut (soit +1 CCC CCC-CCCC), avec $pattern_output.

On aurai pu ne pas capture le "+1" et le mettre directement dans le résultat:


$pattern_input = '/^\+1([0-9]{3})([0-9]{3})([0-9]{4})$/';
$pattern_output = '+1 $1 $2-$3';
$num_format = preg_replace($pattern_input, $pattern_output, $num);
Smiley cligne Je vois surtout la difficulté de saisir tous les formats de tous les pays, puis vérifier, car tes explications me semblent assez claires.
c'est vrai que c'est un travail de fourmis, moi je n'ai pas ce problème, vu qu' on étend progressivement l'activité pays par pays