|
1095 | 1095 | // https://gist.github.com/dperini/729294 |
1096 | 1096 | var regex = |
1097 | 1097 | "^" + |
1098 | | - // schemes |
1099 | | - "(?:(?:" + schemes.join("|") + "):\\/\\/)" + |
1100 | | - // credentials |
1101 | | - "(?:\\S+(?::\\S*)?@)?"; |
1102 | | - |
1103 | | - regex += "(?:"; |
| 1098 | + // protocol identifier |
| 1099 | + "(?:(?:" + schemes.join("|") + ")://)" + |
| 1100 | + // user:pass authentication |
| 1101 | + "(?:\\S+(?::\\S*)?@)?" + |
| 1102 | + "(?:"; |
1104 | 1103 |
|
1105 | 1104 | var tld = "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))"; |
1106 | 1105 |
|
1107 | | - // This ia a special case for the localhost hostname |
1108 | 1106 | if (allowLocal) { |
1109 | 1107 | tld += "?"; |
1110 | 1108 | } else { |
1111 | | - // private & local addresses |
1112 | 1109 | regex += |
1113 | | - "(?!10(?:\\.\\d{1,3}){3})" + |
1114 | | - "(?!127(?:\\.\\d{1,3}){3})" + |
1115 | | - "(?!169\\.254(?:\\.\\d{1,3}){2})" + |
1116 | | - "(?!192\\.168(?:\\.\\d{1,3}){2})" + |
1117 | | - "(?!172" + |
1118 | | - "\\.(?:1[6-9]|2\\d|3[0-1])" + |
1119 | | - "(?:\\.\\d{1,3})" + |
1120 | | - "{2})"; |
1121 | | - } |
1122 | | - |
1123 | | - var hostname = |
1124 | | - "(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)" + |
1125 | | - "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*" + |
1126 | | - tld + ")"; |
1127 | | - |
1128 | | - // reserved addresses |
| 1110 | + // IP address exclusion |
| 1111 | + // private & local networks |
| 1112 | + "(?!(?:10|127)(?:\\.\\d{1,3}){3})" + |
| 1113 | + "(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})" + |
| 1114 | + "(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})"; |
| 1115 | + } |
| 1116 | + |
1129 | 1117 | regex += |
| 1118 | + // IP address dotted notation octets |
| 1119 | + // excludes loopback network 0.0.0.0 |
| 1120 | + // excludes reserved space >= 224.0.0.0 |
| 1121 | + // excludes network & broacast addresses |
| 1122 | + // (first & last IP address of each class) |
1130 | 1123 | "(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" + |
1131 | 1124 | "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" + |
1132 | 1125 | "(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" + |
1133 | 1126 | "|" + |
1134 | | - hostname + |
1135 | | - // port number |
1136 | | - "(?::\\d{2,5})?" + |
1137 | | - // path |
1138 | | - "(?:[/?#]\\S*)?" + |
1139 | | - "$"; |
| 1127 | + // host name |
| 1128 | + "(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)" + |
| 1129 | + // domain name |
| 1130 | + "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*" + |
| 1131 | + tld + |
| 1132 | + ")" + |
| 1133 | + // port number |
| 1134 | + "(?::\\d{2,5})?" + |
| 1135 | + // resource path |
| 1136 | + "(?:[/?#]\\S*)?" + |
| 1137 | + "$"; |
1140 | 1138 |
|
1141 | 1139 | var PATTERN = new RegExp(regex, 'i'); |
1142 | 1140 | if (!PATTERN.exec(value)) { |
|
0 commit comments