Carbon6
Carbon6

Reputation: 113

Regular expression to match single dot but not two dots?

Trying to create a regex pattern for email address check. That will allow a dot (.) but not if there are more than one next to each other.

Should match: [email protected]

Should not match: [email protected]

Now I know there are thousands of examples on internet for e-mail matching, so please don't post me links with complete solutions, I'm trying to learn here.

Actually the part that interests me the most is just the local part: test.test that should match and test..test that should not match. Thanks for helping out.

Upvotes: 8

Views: 30422

Answers (5)

Bilal Akil
Bilal Akil

Reputation: 4755

^([^.]+\.?)+@$

That should do for the what comes before the @, I'll leave the rest for you. Note that you should optimise it more to avoid other strange character setups, but this seems sufficient in answering what interests you

Don't forget the ^ and $ like I first did :(

Also forgot to slash the . - silly me

Upvotes: 0

YakovL
YakovL

Reputation: 8365

To answer the question in the title, I'd update the RegExp by Junuxx and allow dots in the beginning and end of the string:

'/^\.?([^\.]|([^\.]\.))*$/'

which is optional . in the beginning followed by any number of non-. or [non-. followed by .].

Upvotes: 0

Junuxx
Junuxx

Reputation: 14281

You may allow any number of [^\.] (any character except a dot) and [^\.])\.[^\.] (a dot enclosed by two non-dots) by using a disjunction (the pipe symbol |) between them and putting the whole thing with * (any number of those) between ^ and $ so that the entire string consists of those. Here's the code:

$s1 = "[email protected]";
$s2 = "[email protected]";
$pattern = '/^([^\.]|([^\.])\.[^\.])*$/';
echo "$s1: ", preg_match($pattern, $s1),"<p>","$s2: ", preg_match($pattern, $s2);

Yields:

[email protected]: 1
[email protected]: 0

Upvotes: 6

MajidTaheri
MajidTaheri

Reputation: 3983

strpos($input,'..') === false

strpos function is more simple, if `$input' has not '..' your test is success.

Upvotes: 1

Mihai Stancu
Mihai Stancu

Reputation: 16127

This seams more logical to me:

/[^.]([\.])[^.]/

And it's simple. The look-ahead & look-behinds are indeed useful because they don't capture values. But in this case the capture group is only around the middle dot.

Upvotes: 5

Related Questions