2009-08-10 10 views
0

J'ai une entrée pour les utilisateurs où ils sont censés entrer leur numéro de téléphone. Le problème est que certaines personnes écrivent leur numéro de téléphone avec des traits d'union et des espaces en eux. Je veux mettre l'entrée par un filtre pour enlever de telles choses et stocker seulement des chiffres dans ma base de données.Liste blanche dans php

J'ai pensé que je pourrais faire un certain str_replace() pour les espaces blancs et les caractères spéciaux. Cependant, je pense qu'une meilleure approche serait de choisir seulement les chiffres au lieu de tout enlever. Je pense que j'ai entendu le terme «whitelisting» à ce sujet.

Pourriez-vous s'il vous plaît me diriger dans la direction de résoudre ceci en PHP?

Exemple: Je veux l'entrée "0333 452-123-4" pour aboutir à "03334521234"

Merci!

Répondre

4

Ceci est un problème non trivial car il y a beaucoup de familiers et de différences régionales. Veuillez vous référer à What is the best way for converting phone numbers into international format (E.164) using Java? C'est Java mais les mêmes règles s'appliquent.

Je dirais que si vous n'avez pas besoin de quelque chose de plus complet, gardez les choses simples. Créez une liste d'expressions régulières valides et vérifiez l'entrée par rapport à chacune jusqu'à ce que vous trouviez une correspondance.

Si vous voulez vraiment simple, il suffit d'enlever les non-chiffres:

$phone = preg_replace('![^\d]+!', '', $phone); 

Soit dit en passant, juste choisir les chiffres est, par définition, le même que la suppression tout le reste. Si vous voulez dire quelque chose de différent, vous pouvez reformuler cela.

+0

Bien expliqué. +1 – Boldewyn

+0

Votre exemple de code a très bien fonctionné, mais j'ai vraiment eu du mal à le comprendre. J'ai écrit: $ phone = preg_replace ('/ [^ \ d] /', '', $ phone); à la place. Y a-t-il une différence entre ces deux-là? Où puis-je en savoir plus sur les points d'exclamation que vous utilisez? –

+0

La seule différence est que je remplace un groupe de non-chiffres par une chaîne vide (d'où l'opérateur + pour indiquer un ou plusieurs) plutôt qu'un seul non-chiffre avec une chaîne vide. Très petite différence vraiment. – cletus

1
$number = filter_var(str_replace(array("+","-"), '', $number), FILTER_SANITIZE_NUMBER_INT); 

Filter_Var supprime tout, points positifs et négatifs, et str_replace se débarrasse de ceux-ci.

ou vous pouvez utiliser preg_replace

$number = preg_replace('/[^0-9]/', '', $number); 
0

Vous pouvez le faire de deux façons. Itérez à travers chaque index de la chaîne, et exécutez is_numeric() dessus, ou vous pourriez utiliser une expression régulière sur la chaîne.

0

Du côté client, je vous recommande d'utiliser un formatage que vous concevez lors de la création d'un formulaire. C'est bon pour les champs zip ou téléphone. Jetez un oeil à cette jquery plugin pour référence. Ce sera beaucoup plus facile du côté serveur.