我的代理解析器以这种方式从txt文件中读取代理:
TYPE | IP | PORT
SOCKS5|192.168.0.1|3128
我想进行验证以确定此行是否有效。
TYPES是SOCKS4,SOCKS5,HTTP和HTTPS。
IP是任何有效的IP。
Port是1到65535之间的任何无符号整数。
任何Regexp专家都可以提供帮助吗?
答案 0 :(得分: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}
虽然没有验证范围。
答案 1 :(得分: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
检索协议答案 2 :(得分:0)
这是一个简单的正则表达式:
/^(:?SOCKS[45]|HTTPS?)\|(:?\d{1,3}\.){3}\d{1,3}\|\d{1,5}$/
但是,就像MK的答案一样,它不会检查IP的组件是0-255,还是端口是1-65535。
Regexp似乎并不是最合适的方法。解析条目并检查所有部分是否遵循规则应该非常简单。 E.g。
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