Просто ради забавы, я собираюсь переусердствовать в этом. Ну, если у вас нет достаточно длинного списка для сравнения.
Предполагая, что вы используете только символы подстановки для обозначения «мне наплевать на этот октет», вы можете проанализировать каждую запись в вашем массиве в четыре значения (по одному на октет). Допустим, вы используете -1 для обозначения подстановочного знака, 0–255 - для точного соответствия этому значению. (Если вам нужна лучшая производительность, чем O (n), где n - это размер списка соответствий, то здесь вы можете использовать более совершенные структуры данных - например, три.) Вызовите этот массив L Конечно, вам нужно сделать это только один раз, а не по запросу.
Затем можно проанализировать удаленный адрес таким же образом (за исключением без подстановочных знаков). Вы также можете поймать REMOTE_ADDR, который не находится в ожидаемом формате, здесь. Теперь становится довольно тривиально проверять совпадения:
has_match(ip) =
for n in [0 … L.length)
if (-1 == L.n.0 || L.n.0 = ip.0) && (-1 == L.n.1 || L.n.1 == ip.1) && …
return true
return false
(это, конечно, псевдокод)