PHP自定义正则表达式

I've written this regex to check for valid emails: /^[-a-z0-9._]+@[-a-z0-9._]+\.+[a-z]{2,6}$/i

I want it to work for emails like name1+name2@domaine.com

How can I fix this regex?

First part

[-a-z0-9._]+

does not accept right now plus sign. Expand it:

[-+a-z0-9._]+

Try

/^[-a-z0-9._+]+@[-a-z0-9._]+\.+[a-z]{2,6}$/i

I Have a simpler solution.

if(filter_var($email,FILTER_VALID_EMAIL))
{
    //true
}

this would be sufficient in most cases, this actually runs an regular check in C which in turn would be faster but if you wish to have control over the reg-ex in your application then the regex below is what's used for this check:

/^((\\\"[^\\\"\\f\
\\\t\\b]+\\\")|([\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\~\\/\\^\\`\\|\\{\\}\\=\\?]+(\\.[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\~\\/\\^\\`\\|\\{\\}\\=\\?]+)*))@((\\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\\-])+\\.)+[A-Za-z\\-]+))$/D

Another tip i will give you is that a user may enter an email address such as: invalid@dontexists.com which would then bypass your checks for a valid email, if you wan't to make sure that dontexists.com is running an email server is do:

$has_mx_server = (bool)checkdnsrr($domain,"MX");

if the domain has a registered MX Record the chances of the email being faked is reduced by a good chunk.

Place the + inside the braces and escape it with a backslash

/^[-a-z0-9._\+]+@[-a-z0-9._]+\.+[a-z]{2,6}$/i

"+" is a meta character meaning to search for 1 or more occurrence, therefore, to search for the actual character, it must be escaped.