正则表达式匹配单点但不是两个点?

时间:2012-05-20 13:38:14

标签: php regex pattern-matching

尝试为电子邮件地址检查创建正则表达式模式。这将允许一个点(。),但如果彼此相邻,则不会。

应匹配: test.test@test.com

不应该匹配: test..test @ test.com

现在我知道互联网上有成千上万的电子邮件匹配示例,所以请不要发布完整解决方案的链接,我想在这里学习。

实际上,我最感兴趣的部分只是本地部分: test.test应该匹配和test..test不匹配。 谢谢你的帮忙。

4 个答案:

答案 0 :(得分:5)

您可以通过使用析取(管道符号[^\.]允许任意数量的[^\.])\.[^\.](除点之外的任何字符)和|(由两个非点包围的点) )在它们之间并将*(任意数量的那些)放在^$之间,以便整个字符串由这些组成。这是代码:

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

收率:

test.test@test.com: 1
test..test@test.com: 0

答案 1 :(得分:4)

这对我更合乎逻辑:

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

这很简单。超前与前景后视确实很有用,因为它们没有捕捉到价值。但在这种情况下,捕获组仅在中间点附近。

答案 2 :(得分:1)

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

strpos函数更简单,如果`$ input'没有'..'你的测试成功。

答案 3 :(得分:0)

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

那应该对@之前的内容有所帮助,我会为你留下余下的。 请注意,您应该更多地优化它以避免其他奇怪的字符设置,但这似乎足以回答您感兴趣的内容

不要忘记^$,就像我第一次做的那样:(

也忘了削减. - 愚蠢的我