正则表达式匹配user @ domain:port

时间:2015-11-27 09:30:18

标签: php regex

我必须将字符串匹配为user @ domain:port。所以它应该允许域或域:端口或用户@域或用户@域:端口完成。最初我写了多个正则表达式来匹配其中的一些条件,如下所示:

preg_match('/^[A-z0-9_\-]+[@][A-z0-9_\-]+([.][A-z0-9_\-]+)+[A-z.]{2,4}$/', $str) or preg_match('/^[A-z0-9_\-]+([.][A-z0-9_\-]+)+[A-z.]{2,4}$/', $str) or preg_match('/^[A-z0-9_\-]+([.][A-z0-9_\-]+)+[A-z.]{2,4}+([:][0-9]+)$/', $str)

但现在我必须涵盖上述所有条件,我认为应该有一个表达式可以通过所有条件。

有人可以告诉我正确的常规exp以符合所有条件和一些解释吗?

我想用PHP来做。

2 个答案:

答案 0 :(得分:0)

Here可以帮助您

正则表达式

^(?:([\w-]+)@)?([\w-\.]+\.[a-zA-Z][\w-]+)(?::([0-9]{1,5}))?$

应该做你想做的事。我们来解释一下: 您首先要匹配(如果存在)用户后跟@。要匹配单词,您可以使用\w,但在正则表达式中,您指定了您希望-中未包含的字符\w(但_是)。因此,为了匹配您的用户,您将执行以下操作:

(?:([\w-]*)@)?

然后你想匹配一个域名

([\w-\.]+\.[a-zA-Z][\w-]+)

域名必须至少有一个点后跟一个单词(顶级域名)。顶级域名不以数字开头(此规则是基于usedTopLevelDomainList

创建的

要完成,你想要匹配一个1-5位数的端口:

(?::([0-9]{0,5}))?

正如所指出的,正则表达式可以匹配不在255最大范围内的IPv4。 验证IPv4的正则表达式为:

^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

Source。我已经更新了以前的正则表达式,以从我的正则表达式中排除IP匹配,并为域名添加OR语句,以匹配基于上述正则表达式的IPv4或我之前定义的域。< / p>

Result与小组分开各个部分:

^(?:([\w-]+)@)?((?:[\w-\.]+\.[a-zA-Z][\w-]+)|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?::([0-9]{1,5}))?$

Result没有任何组只匹配有效案例:

^(?:[\w-]+@)?(?:(?:[\w-\.]+\.[a-zA-Z][\w-]+)|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?::[0-9]{1,5})?$

答案 1 :(得分:0)

您可以使用

^(?:(?:[\w-]+@)?(?:[\w-]+)\.[\w.-]+(?::[0-9]{1,5})?)$

请参阅regex demo

我遇到的问题是第一个user@对于第二个正则表达式是可选的,但对于第三个部分是强制性的。我的正则表达式匹配:

  • (?:(?:[\w-]+@)?(?:[\w-]+)\.[\w.-]+(?::[0-9]{1,5})? -
    • (?:[\w-]+@)? - 包含1个或多个字母数字或-的1或0个序列,然后是@
    • [\w-]+ - 一个或多个字母数字字符或-
    • \.[\w.-]+ - 一个字面点后跟一个或多个字母数字字符,.-
    • (?::[0-9]{1,5})? - 1或0个冒号序列,后跟1到5位