6
votes

Expressions régulières PHP (phonenumber)

J'ai des problèmes avec une expression régulière pour les numéros de téléphone. J'essaie de créer une regex aussi large que possible pour les numéros de téléphone européens. Le numéro de téléphone peut commencer par un + ou avec deux 0 d'avance de 0, suivi d'un nombre compris entre 0 et 40. Ceci n'est pas nécessaire cependant, cette première partie peut également être ignorée. Après cela, il devrait tous être des nombres, regroupés dans des paires d'au moins deux, avec un espace blanche ou un - entre les groupes.

La regex que j'ai assemblée peut être trouvée ci-dessous. P>

+32 a54b 67-0:


10 commentaires

Juste une petite note: vous utilisez + dans des endroits où vous voulez dire "un événement". + signifie "au moins un". Donc, vous voudrez peut-être envisager d'effacer tout + dans la première partie de la regex, car chaque groupe de là devrait se produire exactement une fois et le suivant? fera ensuite le tout. chose facultative.


Utilisez \ s au lieu de mettre les espaces directement


C'est le [0-9] {2,15} qui correspond à la première partie de regex étant facultatif. Comme indiquent les réponses, vous vouliez contraindre la correspondance à la chaîne entière (démarrer les assertions de fin).


Tillhelgehelwig: Merci pour les conseils, j'ai supprimé tous les + in là :) Shammerer: Pourquoi devriez-vous utiliser \ s et non une espace directe? :)


Les chiffres de l'UE commencent par 3 ou 4 (sauf pour les îles de Féroé (298) et Groenland (299)) et certains pays ont eu 3 numéros dans son préfixe pour le code de pays, donc j'ai étendu un peu la regex et le faisait donc que cela ne disposait que de 2 captures Groupes (préfixe et numéro) ^ (((?: 00 | \ +) (?: [34] [0-9] {1,2} | 298 | 299))? [-]? [0-9] {2,15} [-]?) {1,5}) $


Merci Blem, c'est une belle addition :) Une seule question, qu'est-ce que c'est ?: Pour?


() Dans Regex crée un groupe de capture, une fois que vous avez exécuté votre regex, vous pouvez extraire les informations qui se trouvaient à l'intérieur, en ajoutant?: Au début, il ne créera pas de groupe de capture, dans la regex que j'ai publié seulement avoir 2 ( ) sans pour autant :? un autour du préfixe et un autour du nombre, alors une fois que vous avez exécuté la regex, vous pouvez extraire le préfixe et le nombre aux valeurs de sépérat si vous le souhaitez.


Aah, maintenant je vois :) Merci beaucoup!


Voici un exemple: si (ereg ("^ ((((00 | \ +) (?: [34] [0-9] {1,2} | 298 | 299))? [-]? ((?: [0-9] {2,15} [-]?) {1,5}) $ ", $ var, $ regs) {$ CountryCode = $ REGS [1]; $ numéro = $ REGS [2]; } (désolé ça ne va pas bien dans les commentaires)


Pas de problème, je comprends maintenant comment ça marche :) C'est une chose très pratique à savoir :)


3 Réponses :


10
votes

Le problème est que vous n'utilisez pas d'ancrages ^ $ code> pour définir le début et la fin de la chaîne et trouvera donc une correspondance n'importe où dans la chaîne.

/^((\+|00)+[0-4]+[0-9]+)?([ -]?[0-9]{2,15}){1,5}$/


1 commentaires

Merci, que l'astuce et le lien m'ont aussi aidé-moi la comprendre :)



1
votes

Mettez ^ au début du REGEXP et $ à la fin.


0 commentaires

1
votes

Essayez ceci, peut être peut vous aider.

if (ereg("^((\([0-9]{3}\) ?)|([0-9]{3}-))?[0-9]{3}-[0-9]{4}$",$var)) 
{
    $valid = true; 
}


0 commentaires