8
votes

Meilleure pratique pour analyser et valider le numéro de mobile

Je me demande quelle est la meilleure pratique pour analyser et valider un numéro de téléphone portable avant d'envoyer un texte. J'ai du code qui fonctionne, mais j'aimerais trouver de meilleures façons de le faire (comme ma dernière question, cela fait partie de la résolution de ma première année pour écrire un code de meilleure qualité!).

pour le moment Nous sommes très indultes lorsque l'utilisateur entre dans le numéro sur le formulaire, ils peuvent entrer des éléments tels que "+441234567890", "0123456789", "+44 (0) 123456789", "012-345-6789" ou même "n'ont pas de téléphone".

Toutefois, pour envoyer le texte, le format doit être 44xxxxxxxxxx (ceci est uniquement pour les mobiles britanniques), nous devons donc l'analyser et la valider avant que nous puissions envoyer. Vous trouverez ci-dessous le code que j'ai pour l'instant (C #, ASP.NET), ce serait formidable si quelqu'un avait des idées sur la façon de l'améliorer.

Merci,

Annelie < / p> xxx

edit

Voici ce que j'ai fini avec: xxx


4 commentaires

Couper les avantages de zéro au lieu de remplacer "0044".


Super point, je l'ai édité maintenant, merci!


Vous ne pouvez pas simplement couper les zéros principaux parce que "0712345678" deviendra "712345678". Aussi Number.Trim coupera la fuite et le dirigeant des zéros, ce qui est une mauvaise idée aussi.


@Shellshock - Je veux me débarrasser de la naissance principale, mais vous avez raison que les tractions disparaissent également lorsque vous effectuez Number.trim. Je vais devoir trouver une autre façon de couper les principaux.


4 Réponses :


0
votes

@Annelie peut-être que vous pouvez mettre à jour votre expression régulière à un plus puissant. Consultez ce site ici . Il contient de nombreuses expressions, mais je pense que l'une des 2 premières expressions du site devrait vous adapter à vous.


0 commentaires

4
votes

Utilisez une expression régulière pour éliminer tous les caractères non numériques au lieu d'essayer de deviner comment une personne entrera dans leur numéro - ceci éliminera toutes vos méthodes de remplacement () et de taille (), sauf si vous n'avez pas vraiment besoin de couper un zéro à la hauteur. .

string CleanPhone(string phone)
{
    Regex digitsOnly = new Regex(@"[^\d]");   
    return digitsOnly.Replace(phone, "");
}


2 commentaires

La documentation que j'ai pour la passerelle SMS spécifiée 44XXXXXXXXXXX comme format pour envoyer le numéro dans, il est possible qu'ils accepteraient également +44, 0044 et 0xxxxxxxxx. Cependant, nous voulons qu'ils puissent entrer l'une d'entre elles sur le formulaire, et même si cela leur convient de saisir un numéro non-Royaume-Uni, nous devons toujours veiller à ce que les textes ne soient envoyés que aux numéros britanniques. Peut-être qu'une combinaison de cela et de la garniture et de remplacer les méthodes est la voie à suivre?


Si vous devez accepter une grande variété de formats, une zone de texte masquée pourrait ne pas être la voie à suivre, car je ne peux pas penser à un moyen de le rendre suffisamment générique pour vos besoins. Cependant, la méthode ci-dessus sera très utile pour éliminer tous les caractères non numériques de la chaîne d'entrée.



1
votes

Vérifiez Qas, c'est une solution commerciale.

Ils ont des validations d'email, de téléphone et d'adresse.

http://www.qas.com/phone-number- validation-web-service.htm

Nous utilisons leurs services pour l'adresse et le courrier électronique (pas de téléphone) et nous en avons été satisfaites.


0 commentaires

0
votes
public class PhoneNumber
{
    public PhoneNumber(string value)
    {
        if (String.IsNullOrEmpty(value))
            throw new ArgumentNullException("numberString", Properties.Resources.PhoneNumberIsNullOrEmpty);

        var match = new Regex(@"\+(\w+) \((\w+)\) (\w+)", RegexOptions.Compiled).Match(value);
        if (match.Success)
        {
            ushort countryCode = 0;
            ushort localCode = 0;
            int number = 0;

            if (UInt16.TryParse(match.Result("$1"), out countryCode) &&
                UInt16.TryParse(match.Result("$2"), out localCode) &&
                Int32.TryParse(match.Result("$3"), out number))
            {
                this.CountryCode = countryCode;
                this.LocalCode = localCode;
                this.Number = number;
            }
        }
        else
        {
            throw new ArgumentNullException("numberString", Properties.Resources.PhoneNumberInvalid);
        }
    }

    public PhoneNumber(int countryCode, int localCode, int number)
    {
        if (countryCode == 0)
            throw new ArgumentOutOfRangeException("countryCode", Properties.Resources.PhoneNumberIsNullOrEmpty);
        else if (localCode == 0)
            throw new ArgumentOutOfRangeException("localCode", Properties.Resources.PhoneNumberIsNullOrEmpty);
        else if (number == 0)
            throw new ArgumentOutOfRangeException("number", Properties.Resources.PhoneNumberIsNullOrEmpty);

        this.CountryCode = countryCode;
        this.LocalCode = localCode;
        this.Number = number;
    }

    public int CountryCode { get; set; }

    public int LocalCode { get; set; }

    public int Number { get; set; }

    public override string ToString()
    {
        return String.Format(System.Globalization.CultureInfo.CurrentCulture, "+{0} ({1}) {2}", CountryCode, LocalCode, Number);
    }

    public static bool Validate(string value)
    {
        return new Regex(@"\+\w+ \(\w+\) \w+", RegexOptions.Compiled).IsMatch(value);
    }

    public static bool Validate(string countryCode, string localCode, string number, out PhoneNumber phoneNumber)
    {
        var valid = false;
        phoneNumber = null;
        try
        {
            ushort uCountryCode = 0;
            ushort uLocalCode = 0;
            int iNumber = 0;

            // match only if all three numbers have been parsed successfully
            valid = UInt16.TryParse(countryCode, out uCountryCode) &&
                    UInt16.TryParse(localCode, out uLocalCode) &&
                    Int32.TryParse(number, out iNumber);

            if (valid)
                phoneNumber = new PhoneNumber(uCountryCode, uLocalCode, iNumber);
        }
        catch (ArgumentException)
        {
            // still not match
        }
        return valid;
    }
}

0 commentaires