私のプロキシ パーサーは、次のように txt ファイルからプロキシを読み取ります。
TYPE | IP | PORT
SOCKS5|192.168.0.1|3128
この行が有効かどうかを確認するために検証を行います。
TYPES は、SOCKS4、SOCKS5、HTTP、および HTTPS です。
IP は任意の有効な IP です。
ポートは、1 ~ 65535 の任意の符号なし整数です。
正規表現の専門家が助けてくれますか?
これを行う簡単な正規表現は次のとおりです。
/^(:?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
範囲チェックの場合、正規表現は効率的ではないと思います...([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 でプロトコルを取得します
(SOCKS4|SOCKS5|HTTP|HTTPS)\|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\|[0-9]{1,5}
ただし、範囲は検証されません。