You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
2.8 KiB
62 lines
2.8 KiB
2 years ago
|
import assertString from './util/assertString';
|
||
|
/**
|
||
|
11.3. Examples
|
||
|
|
||
|
The following addresses
|
||
|
|
||
|
fe80::1234 (on the 1st link of the node)
|
||
|
ff02::5678 (on the 5th link of the node)
|
||
|
ff08::9abc (on the 10th organization of the node)
|
||
|
|
||
|
would be represented as follows:
|
||
|
|
||
|
fe80::1234%1
|
||
|
ff02::5678%5
|
||
|
ff08::9abc%10
|
||
|
|
||
|
(Here we assume a natural translation from a zone index to the
|
||
|
<zone_id> part, where the Nth zone of any scope is translated into
|
||
|
"N".)
|
||
|
|
||
|
If we use interface names as <zone_id>, those addresses could also be
|
||
|
represented as follows:
|
||
|
|
||
|
fe80::1234%ne0
|
||
|
ff02::5678%pvc1.3
|
||
|
ff08::9abc%interface10
|
||
|
|
||
|
where the interface "ne0" belongs to the 1st link, "pvc1.3" belongs
|
||
|
to the 5th link, and "interface10" belongs to the 10th organization.
|
||
|
* * */
|
||
|
|
||
|
var IPv4SegmentFormat = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
|
||
|
var IPv4AddressFormat = "(".concat(IPv4SegmentFormat, "[.]){3}").concat(IPv4SegmentFormat);
|
||
|
var IPv4AddressRegExp = new RegExp("^".concat(IPv4AddressFormat, "$"));
|
||
|
var IPv6SegmentFormat = '(?:[0-9a-fA-F]{1,4})';
|
||
|
var IPv6AddressRegExp = new RegExp('^(' + "(?:".concat(IPv6SegmentFormat, ":){7}(?:").concat(IPv6SegmentFormat, "|:)|") + "(?:".concat(IPv6SegmentFormat, ":){6}(?:").concat(IPv4AddressFormat, "|:").concat(IPv6SegmentFormat, "|:)|") + "(?:".concat(IPv6SegmentFormat, ":){5}(?::").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,2}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){4}(?:(:").concat(IPv6SegmentFormat, "){0,1}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,3}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){3}(?:(:").concat(IPv6SegmentFormat, "){0,2}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,4}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){2}(?:(:").concat(IPv6SegmentFormat, "){0,3}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,5}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){1}(?:(:").concat(IPv6SegmentFormat, "){0,4}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,6}|:)|") + "(?::((?::".concat(IPv6SegmentFormat, "){0,5}:").concat(IPv4AddressFormat, "|(?::").concat(IPv6SegmentFormat, "){1,7}|:))") + ')(%[0-9a-zA-Z-.:]{1,})?$');
|
||
|
export default function isIP(str) {
|
||
|
var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
||
|
assertString(str);
|
||
|
version = String(version);
|
||
|
|
||
|
if (!version) {
|
||
|
return isIP(str, 4) || isIP(str, 6);
|
||
|
}
|
||
|
|
||
|
if (version === '4') {
|
||
|
if (!IPv4AddressRegExp.test(str)) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
var parts = str.split('.').sort(function (a, b) {
|
||
|
return a - b;
|
||
|
});
|
||
|
return parts[3] <= 255;
|
||
|
}
|
||
|
|
||
|
if (version === '6') {
|
||
|
return !!IPv6AddressRegExp.test(str);
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|