为了准确性和灵活性,我会使用正则表达式:
$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 也在完整类中指定