JavaScript正则表达式 - 域URL

时间:2017-11-01 12:35:35

标签: javascript regex

我有一个包含字段“URL”的表单。第一部分需要由用户在文本框中填充。第二部分是预定义的,显示在文本框的右侧。

例如,用户在文本框中输入“test”。第二部分预定义为“.example.com”。因此,总网址变为“test.example.com”。

我需要一个正则表达式来验证第一部分。要满足以下条件:

  1. 不应以连字符开头或结尾

  2. 至少应包含一个字母

  3. 长度应在4到21之间

    我使用了此主题中提到的正则表达式/^(?!:\/\/)([a-zA-Z0-9]+\.)?[a-zA-Z0-9][a-zA-Z0-9-]+\.[a-zA-Z]{2,6}?$/I

  4. Javascript regex to match fully qualified domain name, without protocol, optional subdomain

    但是这个正则表达式验证了整个URL(包括第二部分)。我只需要第一部分的验证。

    如何修改当前正则表达式以符合要求?

3 个答案:

答案 0 :(得分:0)

分解。使用正则表达式:

  • [Range(1,10)](必须匹配)
  • /^-|-$/(必须匹配)
  • /[a-z]/i(必须匹配)

这样做的好处是您可以向用户提供有意义的错误消息。

/^[a-z0-9-]{4,21}$/i
document.getElementById('subdomain').addEventListener("input",function() {
  var input = this.value;
  if( input.match(/^-|-$/)) this.setCustomValidity("Cannot start or end with a hyphen");
  else if( !input.match(/[a-z]/i)) this.setCustomValidity("Must contain at least one letter");
  else if( !input.match(/^[a-z0-9-]{4,21}$/)) this.setCustomValidity("Must be between 4 and 21 characters long");
  // add additional checks here, eg. /^[0-9]/ => Cannot start with a number
  else this.setCustomValidity("");
},true);

答案 1 :(得分:0)

这应该可以解决问题:

/^(?=.*[A-Za-z])([0-9A-Za-z][0-9A-Za-z-]{2,19}[0-9A-Za-z])$/

说明:

  • (?=.*[A-z])积极向前看(至少有一个来自[A-z]的字符集)
  • ([0-9A-z]打开没有连字符的模式
  • [0-9A-z])关闭没有连字符的模式
  • [0-9A-z-]{2,19} - 应该在第一个和最后一个字符之间的其余部分(使用连字符,从4 - 221 - 2

检查:



var RE = /^(?=.*[A-z])([0-9A-z][0-9A-z-]{2,19}[0-9A-z])$/;

console.log(RE.test('-hyphen'), false);
console.log(RE.test('hyphen-'), false);
console.log(RE.test('lt4'), false);
console.log(RE.test('morethan21-morethan21-morethan21-morethan21-morethan21'), false);
console.log(RE.test('23123'), false);
console.log(RE.test('231-23'), false);
console.log(RE.test('[\]^_`'), false);
console.log(RE.test('H231-23'), true);
console.log(RE.test('2s31-23'), true);




this answer积极展望东西(?=.*[A-z])

的积分

答案 2 :(得分:0)

我看到了很多问题和答案,我无法给出一个很好的答案。 我看到有些人没有遵循域名注册的规则,例如(域名中不能连续多次使用“-”,但可以多次使用。例如:www.my--domain-name.com为假,并且www.my-domain-name.com是正确的。 例如,我看到了此链接What is a good regular expression to match a URL?,但存在一些问题。 我使用了这段代码(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,}),但无法解决问题

我在asp.net中使用了此正则表达式,它对我的​​工作是如此好:

^[(((ftp|http|https):\/\/)?(?:www\.|(?!www))[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+(-[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+)*\.[^\s^_]{2,}|www\.[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+(-[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+)*\.[^\s^_]{2,}|((ftp|http|https):\/\/)?(?:www\.|(?!www))[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+(-[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+)*\.[^\s^_]{2,}|www\.[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+(-[\u0061-\u007a\u0041-\u005a\u0030-\u0039 \u2000-\u200f\u2028-\u202f\u0621-\u0628\u062a-\u063a\u0641-\u0642\u0644-\u0648\u064e-\u0651\u0655\u067e\u0686\u0698\u06a9\u06af\u06be\u06cc\u06f0-\u06f9\u0629\u0643\u0649-\u064b\u064d\u06d5\u0660-\u0669\u005c]+)*\.[^\s^_]{2,}]{1,2083}$

当然,我的正则表达式专门针对波斯语言,如果您想将其用于英语,则必须使用以下语言:

^[(((ftp|http|https):\/\/)?(?:www\.|(?!www))[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+(-[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+)*\.[^\s^_]{2,}|www\.[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+(-[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+)*\.[^\s^_]{2,}|((ftp|http|https):\/\/)?(?:www\.|(?!www))[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+(-[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+)*\.[^\s^_]{2,}|www\.[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+(-[\u0061\u002d\u007a\u0041\u002d\u005a\u0030\u002d\u0039]+)*\.[^\s^_]{2,}]{1,2083}$