Đây là trường hợp bạn quyết định đi với nhận xét của tôi, cho thấy bạn không sử dụng regexps. Chưa được kiểm tra (nhưng có lẽ làm việc, hoặc ít nhất là đóng), trong Perl:
@private = (
{network => inet_aton('127.0.0.0'), mask => inet_aton('255.0.0.0') },
{network => inet_aton('192.168.0.0'), mask => inet_aton('255.255.0.0') },
# ...
);
$ip = inet_aton($ip_text);
if (grep $ip & $_->{mask} == $_->{network}, @private) {
# ip address is private
} else {
# ip address is not private
}
Note tại như thế nào @private
chỉ là dữ liệu mà bạn có thể dễ dàng thay đổi. Hoặc tải xuống khi đang bay từ Cymru Bogon Reference.
chỉnh sửa: Nó xảy ra với tôi rằng yêu cầu một regexp Perl không có nghĩa là bạn biết Perl, do đó, dòng chính là có 'grep', mà chỉ lặp trên mỗi dải địa chỉ riêng. Bạn lấy IP của bạn, bitwise và nó với mặt nạ mạng, và so sánh với địa chỉ mạng. Nếu bằng nhau, một phần của mạng riêng đó.
Trước tiên, bạn nên xem lại RFC1918 để có được danh sách thích hợp. Thứ hai, tôi đề nghị rằng một giải pháp không liên quan đến regexps sẽ dễ bảo trì hơn. Khi bạn chuyển đổi một địa chỉ IP thành số, nó khá dễ dàng để so khớp nó với một danh sách các dải IP riêng. Điều này cũng sẽ cho phép bạn dễ dàng sử dụng danh sách bogon công khai có sẵn, chứa nhiều hơn RFC1918. – derobert
@derobert đúng, nhưng đối với các công dụng như Bộ lọc Địa chỉ Từ xa Tomcat, bạn cần một cụm từ thông dụng. – Raedwald
Đó là một lỗi mới bắt đầu phổ biến để suy nghĩ '^' có nghĩa là "không" trong ngữ cảnh này, vì vậy nó chỉ ra: Mỗi '^' trong biểu thức của bạn chỉ đơn giản là neo khớp với đầu dòng. Trong regex truyền thống, không có cách nào đơn giản để nói "không phải chuỗi này" mặc dù các biểu thức tương thích Perl/PCRE có các dấu hiệu tiêu cực với '(?! ...)' – tripleee