11
votes

Comment valider une adresse électronique codée non-anglais (UTF-8) en JavaScript et PHP?

Une partie d'un site web que je travaille actuellement contient le processus d'enregistrement où les utilisateurs doivent fournir leur adresse électronique. Juste récemment, je suis devenu conscient que des domaines basés sur l'ASCII sont possibles (le courrier électronique). Mon backend est UTF-8 codé MySQL où je m'attends à ce que les utilisateurs (avec différents locaux) devraient pouvoir entrer leur email mais ne savez pas valider ce type d'adresse électronique.

Vous testez actuellement les outils JQuery et valide correctement l'adresse électronique anglaise, mais ne parvient pas à valider le courrier électronique non ASCII. De plus, j'ai besoin de faire la même chose au côté serveur avec PHP. Existe-t-il une expression régulière qui peut valider ce type d'adresse e-mail?

J'ai essayé cela, mais il échoue dans les outils de jQuery (ce n'est qu'un exemple de démo, je ne comprends pas cela aussi)

光 发光 光 发光 .com

aussi ce qui va se passer quand ils tapent leur adresse e-mail anglaise (Jonesmith@somemail.com) avec leur propre IME. Peut-on être validé avec une expression régulière actuelle que nous avons pour la validation de la messagerie anglaise. Actuellement, je n'ai pas à vous inquiéter si cet email existe pour pas.

merci


2 commentaires

Vous pouvez utiliser \ p {l} pour correspondre à n'importe quel lettre Unicode .


@Mario utilisant votre exemple, vient de poster une réponse!


7 Réponses :



14
votes

Tentative de valider les adresses électroniques peut ne pas être une bonne idée. Les spécifications ( RFC5321 , RFC5322 ) Permet de tellement de flexibilité qui les validant avec des expressions régulières est littéralement impossible et la validation d'une fonction est beaucoup de travail. Le résultat de ceci est que la plupart des systèmes de validation par courrier électronique finissent par rejeter un grand nombre d'adresses électroniques valides, de nombreuses inconvénients des utilisateurs. (De loin, l'exemple le plus courant de cela ne permet pas le caractère + .)

Il est plus probable que l'utilisateur soit (accidentellement ou délibérément) entrant une adresse électronique incorrecte que dans une adresse de messagerie non valide, la validation de manière non valide est une grande nécessité de très peu d'avantages, avec des coûts éventuels si vous le faites de manière incorrecte.

Je vous recommanderais de vérifier simplement la présence d'un caractère @ sur le client, puis envoyez un email de confirmation pour le vérifier; C'est le moyen le plus pratique de valider et cela confirme que l'adresse est aussi correcte.


2 commentaires

Merci pour la suggestion. Je voulais savoir si des mailers comme Sendmail ou PHPMail peuvent gérer cette adresse électronique codée UTF-8 de la boîte sans modification de ma part.


Bien que techniquement correct que la validation d'un courrier électronique avec regex est presque impossible, je ne pouvais pas être plus en désaccord avec cette réponse en tant que solution générale. Dans la plupart des applications Real World (non théorique), vous stockiez l'adresse e-mail correspondante dans une base de données et / ou de faire une certaine manipulation à l'avenir. Autoriser toute vieille chaîne UTF-8 de passer sans encombrement de la couche de données est une idée terrible . Je préfère rejeter quelques adresses électroniques valides "hors du mur" que 100% de chances d'une attaque d'injection intelligente. Dans le monde réel, "hi" \ ~ e ^ ery! @Myhost ne viendra pas trop souvent.



-3
votes

Qu'en est-il de quelque chose que cela: xxx


3 commentaires

cette regex ne fait pas vraiment de validation (retournera de faux positifs et de faux négatifs)


\ w ne correspond pas. ou - (qui sont des caractères valides pour le domaine et le courrier électronique)


@Edsonmedina> Tous les courriels se terminent par .com



3
votes

Depuis 5.2 PHP a un Construire dans la validation des adresses électroniques . Mais je ne sais pas si cela fonctionne pour les chaînes codées UFT-8: xxx

dans le code source PHP d'origine Vous trouverez le REG exp pour la validation du courrier électronique, ceci peut être utilisé pour la validation manuelle lorsque vous utilisez PHP <5.2.

mise à jour

IDN_TO_ASCII () peut être utilisé pour" convertir le nom de domaine en iDNA ASCII. " Qui peut ensuite être validée avec filtre_var ($ email, filtre_validate_email); xxx


2 commentaires

Merci. Je suppose que c'est une étape vers la bonne direction pour la validation du côté serveur.


Non, ça ne supporte pas UTF-8!



0
votes

a eu cette idée de Page de tutoriel JavaScript . C'est fondamental, mais cela fonctionne pour moi sans vous soucier de la complexité des expressions ordinaires et des normes unicodes.

Validation du côté client strong> p>

if(!isset($_POST['emailaddr']) || trim($_POST['emailaddr']) == "") {
    //Error: Email required
}
else {
    $atpos = strpos($_POST['emailaddr'],'@');
    $stoppos = strpos($_POST['emailaddr'],'.');

    if(($atpos === false) || ($stoppos === false)) {
        //Error: invalid email
    }
    else {
        if($stoppos < $atpos) {
            //Error: invalid email
        }
        else {
            if (($stoppos-$atpos) == 1) {
            //Error: invalid email
        }
    }
}


0 commentaires


2
votes

comme offert par Mario , jouant un peu, je suis venu avec la regex suivante pour valider le courrier électronique non standard Adresse:

^([\p{L}\_\.\-\d]+)@([\p{L}\-\.\d]+)((\.(\p{L}){2,63})+)$


4 commentaires

Il est valable pour PHP, pas pour JavaScript.


@ D.a.h JavaScript ne prend pas en charge les raccourcis unicode. Vous pouvez utiliser Steven Steven Steven Levithan's Package Xrexexp avec Unicode Add-Ons - xregexp.com/plugins.


Quelle belle adresse e-mail! :-) D'accord, j'ai mis à jour la regex. Les traits de soulignement sont effectivement autorisés par de nombreux fournisseurs de messagerie. Merci.


@Iliarostovtsebsv désolé, je n'ai pas vu votre commentaire jusqu'à présent. Upvoted. Merci!