E-posta Doğrulama:. PHP ile yazılmış bir düzenli ifade dönüştürme (gebelik) NET (Regex)

4 Cevap

Based on this answer... http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses/201378#201378

Which led me to this site... http://fightingforalostcause.net/misc/2006/compare-email-regex.php

Benim ASP.NET MVC app için e-posta doğrulama için bu regex kullanmak istiyorum:

/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD

Ne yazık ki, bu hatayı alıyorum

System.ArgumentException was unhandled by user code Message="parsing \"/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+$^&%=~!?{}]+)+@(?:(?![-.])[-a-z0-9.]+(?

Hiç kimse bu. NET'in Regex sınıf tarafından kullanılabilir olması için dönüştürülür, ya da başka bir de yoktur. PHP'nin preg_match fonksiyonu ile daha iyi bir uyum NET düzenli ifade class?

4 Cevap

. NET'te düzenli ifade ile sorun iyelik nicelik desteklenmiyor olmasıdır. Bu kaldırırsanız, bu çalışıyor. İşte C # dize olarak düzenli ifadesidir:

@"^[-_a-z0-9\'+*$^&%=~!?{}]+(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d+)?$"

İşte tüm uymalıdır dizeleri ve gerektiği değil, bu ilk üç olmak üzere the page you linked to dayalı bunun için bir test yatağı, bulunuyor:

using System;
using System.Text.RegularExpressions;

public class Program
{
    static void Main(string[] args)
    {
        foreach (string email in new string[]{
            "l3tt3rsAndNumb3rs@domain.com",
            "has-dash@domain.com",
            "hasApostrophe.o'leary@domain.org",
            "uncommonTLD@domain.museum",
            "uncommonTLD@domain.travel",
            "uncommonTLD@domain.mobi",
            "countryCodeTLD@domain.uk",
            "countryCodeTLD@domain.rw",
            "lettersInDomain@911.com",
            "underscore_inLocal@domain.net",
            "IPInsteadOfDomain@127.0.0.1",
            "IPAndPort@127.0.0.1:25",
            "subdomain@sub.domain.com",
            "local@dash-inDomain.com",
            "dot.inLocal@foo.com",
            "a@singleLetterLocal.org",
            "singleLetterDomain@x.org",
            "&*=?^+{}'~@validCharsInLocal.net",
            "missingDomain@.com",
            "@missingLocal.org",
            "missingatSign.net"
        })
        {
            string s = @"^[-_a-z0-9\'+*$^&%=~!?{}]+(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d+)?$";
            bool isMatch = Regex.IsMatch(email, s, RegexOptions.IgnoreCase);
            Console.WriteLine(isMatch);
        }
    }
}

Çıktı:

True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
False
False
False

Bir sorun olsa bu tür foo\@bar@example.com gibi bazı geçerli e-posta adreslerini, maç için başarısız olmasıdır. Bu çok az daha fazla maç çok iyi.

Eğer gerçekten. NET'te e-posta adreslerini ayrıştırmak için bir RegEx kullanarak olmamalıdır. Sizin iyi bir seçenek çerçevesinde yerleşik işlevini kullanmaktır.

MailAddress class. If it throws a FormatException o adresi hiçbir iyi yapıcısı e-posta dize kullanmaya çalışın.

try 
{
    MailAddress addr = new MailAddress("theEmail@stackoverflow.com")
    // <- Valid email if this line is reached
}
catch (FormatException)
{
    // <- Invalid email if this line is reached
}

O NET'in e-posta ayrıştırma da önemli ölçüde iyileşmiştir nasıl. Açıklar nerede, bir answer a Microsoft developer gave to another email validation question görebilirsiniz. NET 4.0. Bu cevap anda. NET 4.0 beta hala yana, muhtemelen ancak çerçevenin bile önceki sürümleri yeterli e-posta adresi ayrıştırma kodu var, çalışan değil. Sonunda büyük olasılıkla yine e-posta göndermek için MailAddress sınıfını kullanarak gidiyoruz, unutmayın. Neden it e-posta adresi doğrulama için kullanmayın. Sonunda, MailAddress sınıfa geçerli olmak üzere tüm bu konularda zaten nedir.

. NET düzenli ifade sözdizimi PHP gibi aynı değildir, ve Regex olan sadece yerleşik sınıf (ancak diğer üçüncü parti uygulama olabilir) normal ifadeyi kullanmak için. Her neyse, Regex ... düz from the source ile bir e-posta adresini doğrulamak için oldukça kolaydır

^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$

Ben e-ticaret uygulamaları bir demet önce bu fonksiyonu kullanılan ve bir sorun yoktu hiç.

    public static bool IsEmailValid(string emailAddress)
    {
        Regex emailRegEx = new Regex(@"\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b");
        if (emailRegEx.IsMatch(emailAddress))
        {
            return true;
        }

        return false;
    }