正確さと柔軟性のために正規表現を使用します。
$lines = file($blockListFile);
$findIp = '119.92.11';
$findIp = trim($findIp, '.');
// The number of unspecified IP classes (e.g. for "192.92.11", it would be 1,
// but for "192.92" it would be 2, and so on).
$n = 4 - (substr_count($findIp, '.') + 1)
foreach ($lines as $line) {
if (preg_match('/^' . preg_quote($findIp, '/') . '(\.\d{1,3}){0,' . $n . '}$/', $line)) {
// the line matches the search address
} else {
// the line does not match the search address
}
}
このメソッドを使用すると、任意の数のIPクラス(「192.92.11.45」、「192.92.11」、「192.92」、または「192」など)を検索できます。行の先頭で常に一致するため、たとえば、「192.92.11」を検索しても「24.192.92.11」とは一致しません。また、完全なクラスにのみ一致するため、「192.92.11」を検索しても「192.92.115」または「192.92.117.21」には一致しません。
編集:
このソリューションは次のことを前提としていることに注意してください。
- 検索語はフルクラスで指定されます(たとえば、「192.92.11」を検索すると、一致させたいことを意味します
/^192.92.11(\.\d{1,3})?$/
)
- ブロックリストファイルで指定されたIPは、フルクラスでも指定されています