我的代理解析器以这种方式从 txt 文件中读取代理:
TYPE | IP | PORT
SOCKS5|192.168.0.1|3128
我想验证一下这条线是否有效。
类型是 SOCKS4、SOCKS5、HTTP 和 HTTPS。
IP 是任何有效的 IP。
端口是从 1 到 65535 的任何无符号整数。
任何正则表达式专家可以提供帮助?
(SOCKS4|SOCKS5|HTTP|HTTPS)\|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\|[0-9]{1,5}
虽然不验证范围。
对于范围检查,我认为正则表达式效率不高……([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 检索协议
这是一个简单的正则表达式:
/^(:?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