I got a Regex that validates my mail-addresses like this:
([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)
This works perfectly fine, but only allows one e-mail to be entered. Now I wanted to extend that and allow multiple mail-addresses to be added (just like MS Outlook, for example) with a semicolon as a mail-splitter.
[email protected];[email protected];[email protected]
Now I've searched and found this one:
([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}(;|$))
This works on one point, but sadly requires a semicolon at the end of a mail:
[email protected];
This is not what I want when the user only enters one e-mail.
How can I extend my regex above (the first one) to allow multiple mail-addresses to be added while let them be splitted through a semicolon?
You just parse the string into an array of string, each with a single email address. Split the string on your delimiter, get the array of string back and then enumerate the array, sending each email address to your code that validates the address.
To get a valid email id we use a regular expression /^[a-zA-Z0-9.!
Don't use regexes for validating emails, unless you have a good reason not to. Use a verification mail instead. In most cases, a regex that simply checks that the string contains an @ is enough.
This is your original expression, changed so that it allows several emails separated by semicolon and (optionally) spaces besides the semicolon. It also allows a single email address that doesn't end in semicolon.
This allows blank entries (no email addresses). You can replace the final * by + to require at least one address.
(([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s*|\s*$))*
If you need to allow comma, apart from semicolon, you can change this group:
(\s*;\s*|\s*$)
by this one:
(\s*(;|,)\s*|\s*$)
Important note: as states in the comment by Martin, if there are additional text before or after the correct email address list, the validation will not fail. So it would work as an "email searcher". To make it work as a validator you need to add ^
at the beginning of the regex, and $
at the end. This will ensure that the expression matches all the text. So the full regex would be:
^(([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)(\s*;\s*|\s*$))*$
You can add an extra \s*
after the ^
to tolerate blanks at the beginning of the list, like this. I.e. include ^\s*
instead of simply ^
The expression already tolerates blanks at the end as is.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With