new URL
new URL
を利用して検証。
JavaScript
1'use strict';
2function sample1 (string) {
3 const url = new URL(string);
4
5 switch (url.protocol) {
6 case 'https:':
7 case 'http:':
8 const hostname = url.hostname;
9 const i = hostname.indexOf('.');
10 return i !== -1 && i !== 0 && i !== hostname.length - 1;
11 }
12
13 return false;
14}
15
16console.assert(sample1('http://localhost') === false);
17console.assert(sample1('https://.foo') === false);
18console.assert(sample1('https://bar.') === false);
19console.assert(sample1('http://example.com') === true);
20console.assert(sample1('https://baz.example') === true);
21console.assert(sample1('ftp://example.com') === false);
<input type="url">
<input type="url">
を利用して検証。
JavaScript
1'use strict';
2const sample2 = ((baseInput)=>{
3 return function sample2 (string) {
4 const input = baseInput.cloneNode(false);
5 input.value = string;
6
7 return input.validity.valid;
8 };
9})((()=>{
10 const input = document.createElement('input');
11
12 input.type = 'url';
13 input.pattern = 'https?://[^#?/.]+\..+';
14
15 return input;
16})());
17
18console.assert(sample2('http://localhost') === false);
19console.assert(sample2('https://.foo') === false);
20console.assert(sample2('https://bar.') === false);
21console.assert(sample2('http://example.com') === true);
22console.assert(sample2('https://baz.example') === true);
23console.assert(sample2('ftp://example.com') === false);
正規表現
正規表現でも実装できますが、非常に複雑化する為、お勧めしません。
簡略化を試みる場合は妥協が必要になります。
HTML
1<script src="./rfc3986.js"></script>
2<script>
3'use strict';
4function sample3 (string) {
5 const rfc3986 = new RFC3986;
6
7 return new RFC3986().isAbsoluteURI(string) && /https?://[^#?/.]+..+/.test(string);
8}
9
10console.assert(sample3('http://localhost') === false);
11console.assert(sample3('https://.foo') === false);
12console.assert(sample3('https://bar.') === false);
13console.assert(sample3('http://example.com') === true);
14console.assert(sample3('https://baz.example') === true);
15console.assert(sample3('ftp://example.com') === false);
16</script>
Re: jjj001 さん