2017-07-14 112 views
0

以下的正則表達式工作正常情況下,域名是根域,但這正則表達式不承認子域爲有效域:正則表達式來允許子域

例如:abc.com被識別爲有效域名,但如果我用ab.bc.com然後正則表示字符串是無效的,我怎麼能改善這個以支持ab.bc.com呢?

var reg = /^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/; 
    if (!reg.test(the_domain)) 
    { 
     alert('has special characters'); 
    } 
    else 
    { 
     alert('no special characters'); 
    } 

這裏是jsfiddle

+3

您可以使用:'/ ^(?:[A-ZA-Z0-9] [A-ZA-Z0-9 - ] {1,61} [A-ZA-Z0-9 ] \。)+ [a-zA-Z] {2,} $ /' – anubhava

+2

爲了完整起見,頂級域名並不總是遵循'\。[a-zA-Z] {2,}' 。尤其是[國際化域名](https://en.wikipedia.org/wiki/Internationalized_domain_name),例如'.рф'不匹配,因爲它們使用非拉丁字符,甚至在ASCII([punycode] (https://en.wikipedia.org/wiki/Punycode))表單('.xn - p1ai'),它們不匹配,因爲它們包含破折號和數字。 – Frxstrem

+0

@Frxstrem:同意,但現在域名與國際化不是優先事項。謝謝! – kosa

回答

2

您可以添加一個量詞爲XX。模式,並使其爲/^([a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]\.)+[a-zA-Z]{2,}$/

var reg = /^([a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]\.)+[a-zA-Z]{2,}$/; 
 
//         ^    ^ changes made 
 
console.log(reg.test("abc.com")); 
 
console.log(reg.test("ab.bc.com")); 
 
console.log(reg.test("a-b.bc.com")); 
 
console.log(reg.test("ab-.bc.com"));

+0

這似乎工作,會測試一點點。謝謝! – kosa

+0

不客氣! – Psidom

1

/^(\S+\.\S+)$/

這將確保它至少有一個時期和另一個字一個字,如果然後重複它的罰款。

https://jsfiddle.net/3yb1v222/

或更嚴格的字符,你可以這樣做:

/^[A-Za-z0-9-_&\?]+(\.[A-Za-z0-9-_&\?]+){1,2}/

,如果你排除在任何給定的URL路徑,你可以刪除其他特殊字符,但無論是方式......其相同的概念。

https://jsfiddle.net/u7hgabec/

+0

不錯。謝謝! – kosa