Validation du numéro de téléphone américain avec php / regex
EDIT: j'ai mélangé et modifié deux des réponses données ci-dessous à la forme de la fonction complète qui maintenant fait ce que je voulais et puis un peu... Alors j'ai pensé à la poster ici au cas où quelqu'un d'autre vient à la recherche de cette même chose.
/*
* Function to analyze string against many popular formatting styles of phone numbers
* Also breaks phone number into it's respective components
* 3-digit area code, 3-digit exchange code, 4-digit subscriber number
* After which it validates the 10 digit US number against NANPA guidelines
*/
function validPhone($phone) {
$format_pattern = '/^(?:(?:\((?=\d{3}\)))?(\d{3})(?:(?<=\(\d{3})\))?[\s.\/-]?)?(\d{3})[\s\.\/-]?(\d{4})\s?(?:(?:(?:(?:e|x|ex|ext)\.?\:?|extension\:?)\s?)(?=\d+)(\d+))?$/';
$nanpa_pattern = '/^(?:1)?(?(?!(37|96))[2-9][0-8][0-9](?<!(11)))?[2-9][0-9]{2}(?<!(11))[0-9]{4}(?<!(555(01([0-9][0-9])|1212)))$/';
//Set array of variables to false initially
$valid = array(
'format' => false,
'nanpa' => false,
'ext' => false,
'all' => false
);
//Check data against the format analyzer
if(preg_match($format_pattern, $phone, $matchset)) {
$valid['format'] = true;
}
//If formatted properly, continue
if($valid['format']) {
//Set array of new components
$components = array(
'ac' => $matchset[1], //area code
'xc' => $matchset[2], //exchange code
'sn' => $matchset[3], //subscriber number
'xn' => $matchset[4], //extension number
);
//Set array of number variants
$numbers = array(
'original' => $matchset[0],
'stripped' => substr(preg_replace('[\D]', '', $matchset[0]), 0, 10)
);
//Now let's check the first ten digits against NANPA standards
if(preg_match($nanpa_pattern, $numbers['stripped'])) {
$valid['nanpa'] = true;
}
//If the NANPA guidelines have been met, continue
if($valid['nanpa']) {
if(!empty($components['xn'])) {
if(preg_match('/^[\d]{1,6}$/', $components['xn'])) {
$valid['ext'] = true;
}
}
else {
$valid['ext'] = true;
}
}
//If the extension number is valid or non-existent, continue
if($valid['ext']) {
$valid['all'] = true;
}
}
return $valid['all'];
}
source d'informationauteur Josh
Vous devez vous connecter pour publier un commentaire.
L'actuel REGEX
a beaucoup de problèmes, résultant en elle de répondre à l'ensemble des éléments suivants, entre autres:
(0./-000 ./-0000 x00000000000000000000000)
()./1234567890123456789012345678901234567890
\)\-555/1212 x
Je pense que cette expression est à rapprocher de ce que vous êtes à la recherche pour:
ou, a explosé:
Cette modification apporte plusieurs améliorations.
preg_match()
.Il a quelques limitations mineures. Ils sont probablement peu d'importance, mais sont en train d'être noté ici.
La NANPA règles sont adaptées à la REGEX suivante, trouvée ici: http://blogchuck.com/2010/01/php-regex-for-validating-phone-numbers/
Pourquoi ne pas convertir toute une série de lettres à "x". Puis de cette façon, vous avez toutes les possibilités convertis à "x".
OU
Vérifier 3digits, 3digits, 4digits, 1orMoreDigits et le mépris des autres caractères entre
Regex:
([0-9]{3}).*?([0-9]{3}).*?([0-9]{4}).+?([0-9]{1,})
Sinon, vous pouvez utiliser certains assez simple et directe JavaScript pour forcer l'utilisateur à entrer dans une beaucoup plus de format spécifié. Le Masked Entrée Plugin ( http://digitalbush.com/projects/masked-input-plugin/ ) pour jQuery vous permet de masque HTML entrée comme un numéro de téléphone, en ne permettant à la personne d'entrer un nombre dans le format xxx-xxx-xxxx. Il ne résout pas votre extension de questions, mais il ne fournir pour un beaucoup plus propre expérience de l'utilisateur.
Eh bien, vous pourriez modifier la regex, mais il ne sera pas très agréable, devraient vous permettre de "pst"? Comment à propos de "extentn"? Comment au sujet de "et ensuite, vous devez composer le"?
Je pense que la "bonne" façon de le faire est d'ajouter un séparé, numérique, formulaire d'extension de zone.
Mais si vous voulez vraiment les regex, je pense que j'ai fixée. Astuce: vous n'avez pas besoin
[x]
pour un seul caractère,x
fera.Vous avez permis à un point, une barre oblique, un tableau de bord, et un caractère d'espacement. Vous devrait permettre un seul de ces options. Vous aurez besoin de mettre à jour les références à
$matches
; la durée de groupes sont maintenant 0, 2, et 4.P. S. Ce n'est pas testé, car je n'ai pas de référence implémentation de PHP en cours d'exécution. Toutes mes excuses pour les fautes, s'il vous plaît laissez-moi savoir si vous trouvez tout et je vais essayer de les réparer.
Modifier
Cela se résume bien mieux que je peux ici.