2015-02-11 77 views
1

我有一個帶有字段的表單。他們需要輸入的格式如下。 10.222.92.160(asxvlc558-ipsn),10.222.92.161(asxvlc559-ipsn),10.222.92.162(asxvlc560-ipsn)檢查變量中括號的語法

我不在乎太多的括號之間什麼,但我不關心IP格式,其中Parens和逗號分隔。

有人可以提供一段代碼。我試圖使用RegExp來做到這一點,但無法獲得正確的匹配。

這裏是表格線

<textarea name="ro_access" onchange='validatehost(this.value)'> 
10.10.10.10(somehost01-ipsn),10.10.10.11(somehost02-ipsn)</textarea></td> 

這是我在JS部分刺。沒有太多的JS人,所以不會笑得太多。

function validatehost(value) { 
    var ipRE = new RegExp('\d+\.\d+\.\d+\.\d+\(*\),'); 
     var r = ipRE.test(value); 
if (r >= 0) { 
    alert("Hostnames are not in the Right Format. Use:ip(hostname),"); 
     document.NFSNew.ro_access.focus(); 
     return false; 
} 
    } 
+0

你的'*'是錯誤的。 – SLaks 2015-02-11 22:39:33

回答

0

這裏有一個簡單的例子:

function validatehost (value) { 
 
    var ipRE = /^\s*(?:\d+\.\d+\.\d+\.\d+\(.*?\)(?:,(?!\s*$)|\s*$))+$/; 
 
    alert(ipRE.test(value)); 
 
}
<textarea id="text" cols="40"> 
 
10.10.10.10(somehost01-ipsn),10.10.10.11(somehost02-ipsn) 
 
</textarea> 
 
<button onclick="validatehost(document.getElementById('text').value)">Validate</button>

主要錯誤在那裏:

new RegExp('\d+\.\d+\.\d+\.\d+\(*\),'); 

你傳遞一個字符串RegExp構造,但你的反斜槓丟失:輸入"\d"在JS控制檯中,您會看到它最終爲"d"。你或者不得不加倍反斜槓或者像我那樣使用正則表達式。

我也改變了正則表達式。它應該符合你的需求。

+0

注意:它將匹配尾隨逗號。只是讓你知道。 – hwnd 2015-02-11 23:19:52

+0

@hwnd謝謝,修正。 – 2015-02-11 23:23:11

0

這應該這樣做:

function validateHost(hosts) { 
    return /^\s*(?:(?:\d{1,3}\.){3}\d{1,3}\([a-zA-Z0-9-]+\)(?:,\d|$))+\s*$/.test(hosts); 
} 

的主機名部分將接受這個角色a-zA-Z0-9-(全部小寫,全大寫和所有的數字),如果你不關心你可以把.+?這意味着什麼,但至少1個字符。對於ip部分將需要最多3位數字,每個數字最少1個,最多4個數字。這不是傻瓜證明,因爲有人可以輸入一個高於255的數字,但應該非常穩固。如果你想完美匹配並且不想在字符串周圍留下任何空格,請刪除\s*

+0

注意:您的正則表達式似乎不匹配。 – hwnd 2015-02-11 23:19:27

+0

它匹配但不允許任何空格在開頭https://regex101.com/r/lL4vV2/1,相應地更改。 – ntrp 2015-02-11 23:20:55

1

正則表達式的語法是錯誤的,通過用*量詞對其進行量化,您匹配(「零個或多個」時間。相反,您可以使用.並將其設置爲非貪婪匹配。

如果格式可以重複,我會把它放在一個組中並使用錨點。

var ipRE = /^\s*(?:\d+\.){3}\d+\(.*?\)(?:,(?:\d+\.){3}\d+\(.*?\))*\s*$/ 

注:它很容易在這裏使用的,而不是一個RegExp對象字面正則表達式。