行验证的正则表达式模式

时间:2012-09-25 01:03:41

标签: php regex file parsing ip

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

 TYPE |     IP    | PORT
SOCKS5|192.168.0.1|3128

我想进行验证以确定此行是否有效。

TYPES是SOCKS4,SOCKS5,HTTP和HTTPS。

IP是任何有效的IP。

Port是1到65535之间的任何无符号整数。

任何Regexp专家都可以提供帮助吗?

3 个答案:

答案 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