0

私のプロキシ パーサーは、次のように txt ファイルからプロキシを読み取ります。

 TYPE |     IP    | PORT
SOCKS5|192.168.0.1|3128

この行が有効かどうかを確認するために検証を行います。

TYPES は、SOCKS4、SOCKS5、HTTP、および HTTPS です。

IP は任意の有効な IP です。

ポートは、1 ~ 65535 の任意の符号なし整数です。

正規表現の専門家が助けてくれますか?

4

3 に答える 3

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 に答える
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
(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 に答える