preg:如何编写一个 preg 模式来从电子邮件中获取域名?

24

我想从类似于something@gmail.com的电子邮件地址中提取域名gmail.com,并且我想在Javascript中使用该模式来处理文本框的值。

请为上述要求建议一个更优化和更快的 preg 模式。


2
抱歉,您需要一个 preg 正则表达式还是 JS 正则表达式?它们是不同的,可能不兼容。另外,您尝试过什么? - tobyodavies
我被告知正则表达式比字符串函数更快。我对正则表达式了解不多。 :( - Vinay Jeurkar
9个回答

64

你可以替换掉@符号及其之前的内容,以获得域名。在JavaScript中:

var email = 'test@gmail.com';
var domain = email.replace(/.*@/, "");
alert(domain);

那行不通,参见Jesse Cohen下面的评论。电子邮件地址中可以有多个@字符(尽管在引号之间)。 - Willem Mulder
感谢提供正则表达式,但它只适用于 something.com(不包括子域名)。我已经发布了一个扩展您的解决方案,支持从任何类型的 URL(n 个子域级别)获取域。 - Partha Roy

7
为什么不直接这样做呢?
var email = "something@gmail.com", i = email.indexOf("@");
if (i != -1) {
   email = email.substring(i);
}

正则表达式并不是必须的,你也可以这样做 email = email.split("@")[1];


5
为了解决Jesse Cohen提出的问题,您可以使用email.lastIndexOf('@')+1来获取最后一个@的位置。请参见https://jsfiddle.net/mx6bqytg/1/。 - Maxime Pacary

5

我刚刚遇到了需要实现这个功能的情况,并想出了一个解决方案,它结合了已经提到的大多数技术:

var email = "test@test@gmail.com";
var email_string_array = email.split("@");
var domain_string_location = email_string_array.length -1;
var final_domain = email_string_array[domain_string_location];

如果电子邮件地址中有多个@符号,只需通过“@”拆分电子邮件字符串并计算创建的新数组中有多少个元素,然后从该数字中减去1,并且您可以从数组中取出具有该数字的右侧元素。

这里是 jsfiddle 链接: http://jsfiddle.net/47yqn/

这对我来说成功率达到了100%!


4

使用简单的字符串分割无法处理像'abc@abc'@example.com这样的地址,尽管在技术上是有效的。我认为在@处进行分割并取最后一个元素应该没问题,因为域名中不允许出现@字符。

或者,由于您要求,可以使用正则表达式:[^@]+$


3
一种更加简洁和现代的方法:
const email = "something@gmail.com"
const domain = email.includes('@') && email.split("@").pop()

如果电子邮件地址中不包含 @ 符号,则该域将为 false


2
您可以这样做。
var extract_company_name = function(email){
  var temp = email.replace(/.*@/, '').split('.');
    return temp[temp.length - 2];
}
extract_company_name(email)

这将从任何电子邮件中提取域名。 在 jsbin 中的代码

1
var email = 'test@gmail.com';
var domain = email.replace(/.*@/, "").split('.')[0];
console.log(domain); // gmail

1

我会尝试

\b.*@([A-Za-z0-9.-]+\.[A-Za-z]{2,4})\b

或许可以通过将\b替换为^$来微调它。 这样就可以匹配任何由A-Z,a-z和0-9字符组成的域名。

-1

你可以通过以下方法从以http开头的网址、电子邮件或网站中获取域名,即只返回域名部分。

var str=inputAddress;
      var patt1 = "(http://|https://|ftp://|www.|[a-z0-9._%+-]+@)([^/\r\n]+)(/[^\r\n]*)?";
var result = str.match(patt1);
var domain=result===null?str:result[2];
return domain.toString().startsWith("www.")?domain.toString().slice(4):domain;

1
我认为让正则表达式做太多的事情并不是一个好主意。它们很容易出现错误。在这种情况下,像 hello@www.example.com 这样的电子邮件会给出域名 example.com,但正确的域名应该是 www.example.com - Vlad V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接