0

我的代理解析器以这种方式从 txt 文件中读取代理:

 TYPE |     IP    | PORT
SOCKS5|192.168.0.1|3128

我想验证一下这条线是否有效。

类型是 SOCKS4、SOCKS5、HTTP 和 HTTPS。

IP 是任何有效的 IP。

端口是从 1 到 65535 的任何无符号整数。

任何正则表达式专家可以提供帮助?

4

3 回答 3

0
(SOCKS4|SOCKS5|HTTP|HTTPS)\|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\|[0-9]{1,5}

虽然不验证范围。

于 2012-09-25T01:07:28.950 回答
0

对于范围检查,我认为正则表达式效率不高……([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])不过会检查 0-255。

正如MK所说,

(SOCKS4|SOCKS5|HTTP|HTTPS)\|(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\|(\d{1,5})

如果您得到完全匹配,请验证标签 \2、\3、\4、\5 是否在 [0-255] 之间作为整数,以及 \6 在 [0-65535] 之间。然后用 \1 检索协议

于 2012-09-25T01:19:52.007 回答
0

这是一个简单的正则表达式:

/^(:?SOCKS[45]|HTTPS?)\|(:?\d{1,3}\.){3}\d{1,3}\|\d{1,5}$/

但是,就像 MK 的回答一样,它不会检查 IP 的组件是 0-255,还是端口是 1-65535。

正则表达式似乎并不是最合适的方法。只需解析条目并检查所有部分是否符合规则应该非常简单。例如

list($type, $ip, $port, $other) = explode('|', $line, 4);
if ($other != '') // report error
if (!preg_match('/^(SOCKS[45]|HTTPS?)$/', $type) // report error
$ip_array = explode('.', $ip);
if (count($ip_array) != 4) // report error
foreach ($ip_array as $octet) {
  if (!preg_match('/^\d+$/', $octet) || $octet > 255) // report error
}
if (!preg_match('/^\d+$/, $port) || $port > 65535) // report error
于 2012-09-25T01:29:07.613 回答