首页 > 解决方案 > SMTP URL 的正则表达式。可以简化吗?

问题描述

大多数 url 的 RegEx 示例还包括我不需要匹配的目录。

鉴于以下网址,您能否确认我的 Current RegEx 是准确的?可以简化吗?

显式 TLS - (iCloud) smtp://smtp.mail.me.com:587

隐式 TLS - (Gmail) smtps://smtp.gmail.com:465

interface UrlParts {
  url: string,
  protocol: string,
  domain: string,
  port: number
}

// 1. url check
function urlValidate(url : any): UrlParts | null {

  // Convert to string and lowercase PRIOR to regex match.
  url = url.toString().toLowerCase();

  // REGEX Pattern to validate url.
  const urlRegexPattern = /(smtps?):\/\/([\d.a-z-]+\.[a-z]{2,63}):(\d{1,5})/;

  const match = url?.match(urlRegexPattern)

  // Perform match
  if(match) {
    return {
      url: match[0],
      protocol: match[1],
      domain: match[2],
      port: parseInt(match[3])
    }
  } else {
    return null;
  }

}

用法:

urlValidate('smtp://smtp.mail.me.com:587');

{
  url: "smtp://smtp.mail.me.com:587",
  protocol: "smtp",
  domain: "smtp.mail.me.com",
  port: 587
}

urlValidate('smtps://smtp.gmail.com:465');

{
  url: "smtps://smtp.gmail.com:465",
  protocol: "smtps",
  domain: "smtp.gmail.com:465",
  port: 465
}

标签: javascriptregextypescriptemailsmtp

解决方案


是的,正则表达式不考虑包含的目录。我仍然会为起始位置设置一个抑扬符。匹配 TLD 和域,可以细化子域。使用 RegEx 也可以使用 smtps://smtp.gmail.comxxxxxxxxxxxx。

/^(smtps?):\/\/([\d.a-z-]+\.[a-z]{2,63}):(\d{1,5})/

推荐阅读