Javascript 如何使用regex验证域名?

Javascript 如何使用regex验证域名?,javascript,regex,Javascript,Regex,这是我验证域名的代码 function frmValidate() { var val = document.frmDomin; if (/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/.test(val.name.value)) { } else { alert("Enter Valid Domain Name"); val.name.focus();

这是我验证域名的代码

function frmValidate() {
    var val = document.frmDomin;
    if (/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/.test(val.name.value)) {
    }
    else {
        alert("Enter Valid Domain Name");
        val.name.focus();
        return false;
    }
}


域名:
现在我输入了
http://devp1.tech.in
,它会提醒消息。我想进入子域也。如何改变这一点?我不应该得到警告。

试试这个正则表达式:

/([a-z0-9]+\.)*[a-z0-9]+\.[a-z]+/
试试这个:

^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+$


函数frmValidate(){
var val=document.frmDomin.name.value;
如果(/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+$/.test(val)){
警报(“有效域名”);
返回true;
}否则{
警报(“输入有效域名”);
val.name.focus();
返回false;
}
}

注意:这不会验证Url。

这有点重:

^(?:(?:(?:[a-zA-z\-]+)\:\/{1,3})?(?:[a-zA-Z0-9])(?:[a-zA-Z0-9\-\.]){1,61}(?:\.[a-zA-Z]{2,})+|\[(?:(?:(?:[a-fA-F0-9]){1,4})(?::(?:[a-fA-F0-9]){1,4}){7}|::1|::)\]|(?:(?:[0-9]{1,3})(?:\.[0-9]{1,3}){3}))(?:\:[0-9]{1,5})?$
将匹配:

  • google.com
  • db.my-website.co.us
  • ftp://container-617.databases.online
  • many port.com:7777
注意:将不匹配
localhost

IPv4

  • 192.168.3.1
  • 127.0.0.1:3306
IPv6(部分支持)

  • [2001:0db8:85a3:0000:0000:8a2e:0370:7334]
  • [2001:db8:85a3:0:0:8a2e:370:7334]
    (与之前相同)
  • [da7a:ba5e:da7a:ba5e:da7a:ba5e:da7a:ba5e]:3306
  • [::1]
    (本地主机环回)
  • [::]
    (未指定地址)
但不是(IPv6)

  • [
    2001:db8:85a3::8a2e:370:7334]

此正则表达式不支持在IPv6地址中将连续的0段折叠为“::”。(阅读:不要在IPv6地址上尝试此功能)

我建议您阅读一下O'Reilly的指南:

尝试使用验证正则表达式的结果

8.15。验证域名问题您想检查字符串是否是有效的、完全限定的域名,或者 在较长的文本中查找此类域名

解决方案检查字符串是否看起来像有效的域名:

^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$
正则表达式选项:不区分大小写的正则表达式样式:.NET、Java、JavaScript、, PCRE、Perl、Python

\A([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}\Z
正则表达式选项:不区分大小写的正则表达式样式:.NET、Java、PCRE、Perl、, Python、Ruby在较长文本中查找有效域名:

\b([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}\b
正则表达式选项:不区分大小写的正则表达式样式:.NET、Java、JavaScript、, PCRE、Perl、Python、Ruby检查域的每个部分是否 长度超过63个字符:

\b((?=[a-z0-9-]{1,63}\.)[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b
正则表达式选项:不区分大小写的正则表达式样式:.NET、Java、JavaScript、, PCRE、Perl、Python、Ruby允许使用 punycode符号:

\b((xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}\b
\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b
正则表达式选项:不区分大小写的正则表达式样式:.NET、Java、JavaScript、, PCRE、Perl、Python、Ruby检查域的每个部分是否 长度超过63个字符,并允许国际化域名 使用punycode表示法:

\b((xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}\b
\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b
正则表达式选项:不区分大小写的正则表达式样式:.NET、Java、JavaScript、, PCRE、Perl、Python、Ruby

讨论 域名的形式为domain.tld、subdomain.domain.tld或任意数量的附加子域


显示示例输入和预期输出。如果您只想验证域名,那么为什么要传递
http://
?包含
http://
将使其成为一个,而不仅仅是一个域名/主机名。我可以看到两个紧迫的问题:不支持.co.uk(或子域,您的问题是关于子域的)但是,两个连续的连字符仅在IDN中有效。您需要在字符类中添加一个点<代码>^[a-zA-Z0-9][a-zA-Z0-9-.]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$你能更新这个答案以允许子域吗?这里缺少一些东西,它不匹配
www.test2.com
,但它匹配
test2.com
。它不测试192.168.3.1在我实现这个答案时,它的作用是
/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+/
regex为什么不包含下划线?像
ti.com
这样的两个字母域不能与这个regex一起工作。@JamesAndersonJr.应该被修复吗?老实说,我不再100%确定regex的大部分功能是什么。。。