Biểu thức chính quy để khớp với tên máy chủ DNS hoặc Địa chỉ IP?


369

Có ai có một biểu thức chính quy tiện dụng sẽ khớp với bất kỳ tên máy chủ DNS hoặc địa chỉ IP hợp pháp nào không?

Thật dễ dàng để viết một cái hoạt động 95% thời gian, nhưng tôi hy vọng sẽ có được thứ gì đó được kiểm tra tốt để khớp chính xác với thông số RFC mới nhất cho tên máy chủ DNS.

Câu trả lời:


535

Bạn có thể sử dụng riêng các biểu thức chính quy sau hoặc bằng cách kết hợp chúng trong biểu thức HOẶC khớp.

ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";

ValidHostnameRegex = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$";

ValidIpAddressRegex khớp với các địa chỉ IP hợp lệ và tên máy chủ hợp lệ của RationalhostnameRegex . Tùy thuộc vào ngôn ngữ bạn sử dụng \ có thể phải thoát với \.


ValidhostnameRegex hợp lệ theo RFC 1123 . Ban đầu, RFC 952 chỉ định rằng các phân đoạn tên máy chủ không thể bắt đầu bằng một chữ số.

http://en.wikipedia.org/wiki/hostname

Thông số ban đầu của tên máy chủ trong RFC 952 , bắt buộc rằng các nhãn không thể bắt đầu bằng chữ số hoặc dấu gạch nối và không được kết thúc bằng dấu gạch nối. Tuy nhiên, một đặc điểm kỹ thuật tiếp theo ( RFC 1123 ) cho phép nhãn tên máy chủ bắt đầu bằng chữ số.

Valid952HostnameRegex = "^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$";

3
Ở đây: stackoverflow.com/questions/4645126/ Mạnh - Tôi giải thích rằng các tên bắt đầu bằng một chữ số cũng được coi là hợp lệ. Ngoài ra, chỉ có một dấu chấm là vấn đề nghi vấn. Sẽ là tuyệt vời để có thêm thông tin phản hồi về điều đó.
BreakPhreak

16
Bạn có thể muốn thêm IPv6. OP không chỉ định loại địa chỉ. (Nhân tiện, nó có thể được tìm thấy ở đây )
new123456

32
Trước khi mọi người mù quáng sử dụng điều này trong mã của họ, lưu ý rằng nó không hoàn toàn chính xác. Nó bỏ qua RFC2181: "Bản thân DNS chỉ đặt một hạn chế trên các nhãn cụ thể có thể được sử dụng để xác định các bản ghi tài nguyên. Một hạn chế đó liên quan đến độ dài của nhãn và tên đầy đủ. Độ dài của bất kỳ một nhãn nào được giới hạn ở giữa 1 và 63 octet. Một tên miền đầy đủ được giới hạn ở 255 octet (bao gồm cả các dấu phân cách). "
đồng rúp

7
@UserControl: Tên máy chủ không phải là tiếng Latin (Punycoding) phải được chuyển đổi thành dạng ASCII trước ( éxämplè.com= xn--xmpl-loa1ab.com) và sau đó được xác thực.
Alix Axel

6
Biểu thức tên máy chủ của bạn khớp với một số giá trị không hợp lệ: Tôi đã thử 123.456.789.0và thông báo đó là tên máy chủ hợp lệ.
lbarreira

62

Regex tên máy chủ của smink không tuân theo giới hạn về độ dài của các nhãn riêng lẻ trong một tên máy chủ. Mỗi nhãn trong tên máy chủ hợp lệ có thể dài không quá 63 octet.

ValidhostnameRegex = "^ ([a-zA-Z0-9] | [a-zA-Z0-9] [a-zA-Z0-9 \ -] {0,61} [a-zA-Z0-9]) \
(\. ([a-zA-Z0-9] | [a-zA-Z0-9] [a-zA-Z0-9 \ -] {0,61} [a-zA-Z0-9])) * $ "

Lưu ý rằng dấu gạch chéo ngược ở cuối dòng đầu tiên (ở trên) là cú pháp shell Unix để tách dòng dài. Bản thân nó không phải là một phần của biểu thức chính quy.

Đây chỉ là biểu thức chính quy trên một dòng duy nhất:

^ ([a-zA-Z0-9] | [a-zA-Z0-9] [a-zA-Z0-9 \ -] {0,61} [a-zA-Z0-9]) (\. ([a-zA-Z0-9] | [a-zA-Z0-9] [a-zA-Z0-9 \ -] {0,61} [a-zA-Z0-9])) * $

Bạn cũng nên kiểm tra riêng rằng tổng chiều dài của tên máy chủ không được vượt quá 255 ký tự . Để biết thêm thông tin, vui lòng tham khảo RFC-952 và RFC-1123.


6
Mô hình máy chủ tuyệt vời. Nó có thể phụ thuộc vào việc triển khai regex của ngôn ngữ của một người, nhưng đối với JS, nó có thể được điều chỉnh một chút để dễ hiểu hơn mà không mất bất cứ điều gì:/^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?(\.[a-z\d]([a-z\d\-]{0,61}[a-z\d])?)*$/i
Dấu chấm phẩy

31

Để khớp với địa chỉ IP hợp lệ, hãy sử dụng biểu thức chính quy sau:

(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}

thay vì:

([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\.([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])){3}

Giải trình

Nhiều công cụ regex phù hợp với khả năng đầu tiên trong ORchuỗi. Ví dụ: thử regex sau:

10.48.0.200

Kiểm tra

Kiểm tra sự khác biệt giữa tốtxấu


5
Đừng quên bắt đầu ^ và kết thúc $ hoặc một cái gì đó như 0.0.0.999 hoặc 999.0.0.0 cũng sẽ khớp. ;)
andreas

1
có để xác thực chuỗi bắt đầu ^ và end $ là bắt buộc, nhưng nếu bạn đang tìm kiếm IP thành văn bản thì không sử dụng nó.
Alban

"Không tham lam" ngoài ý muốn mà bạn xác định cũng áp dụng cho các giải pháp tên máy chủ khác. Sẽ đáng để thêm câu này vào câu trả lời của bạn vì những người khác sẽ không khớp với tên máy chủ đầy đủ. ví dụ: ([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*so với([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]|[a-zA-Z0-9])(\.([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])|[a-zA-Z0-9]))*
ergohack

EDIT: Trong phần trên, sử dụng +ở cuối thay vì *thấy thất bại.
ergohack

5

Tôi dường như không thể chỉnh sửa bài đăng hàng đầu, vì vậy tôi sẽ thêm câu trả lời của mình vào đây.

Đối với tên máy chủ - câu trả lời dễ dàng, ví dụ egrep tại đây - http: //www.linuxinsight.com/how_to_grep_for_ip_addresses_USE_the_gnu_egrep_utility.html

egrep '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'

Mặc dù trường hợp này không chiếm các giá trị như 0 trong octet nắm tay và các giá trị lớn hơn 254 (địa chỉ ip) hoặc 255 (netmask). Có lẽ một bổ sung nếu tuyên bố sẽ giúp.

Đối với tên máy chủ dns hợp pháp, với điều kiện bạn chỉ kiểm tra tên máy chủ internet (chứ không phải mạng nội bộ), tôi đã viết đoạn mã sau đây, một hỗn hợp shell / php nhưng nó nên được áp dụng như bất kỳ biểu thức thông thường nào.

đầu tiên hãy truy cập trang web ietf, tải xuống và phân tích danh sách các tên miền cấp 1 hợp pháp:

tld=$(curl -s http://data.iana.org/TLD/tlds-alpha-by-domain.txt |  sed 1d  | cut -f1 -d'-' | tr '\n' '|' | sed 's/\(.*\)./\1/')
echo "($tld)"

Điều đó sẽ cung cấp cho bạn một đoạn mã re đẹp để kiểm tra tính hợp pháp của tên miền hàng đầu, như .com .org hoặc .ca

Sau đó, thêm phần đầu tiên của biểu thức theo hướng dẫn được tìm thấy ở đây - http: //www.domainit.com/support/faq.mhtml?carget=Domain_FAQ&question=9 (mọi kết hợp chữ và số và ký hiệu '-', dấu gạch ngang không nên có trong sự bắt đầu hoặc kết thúc của một octet.

(([a-z0-9]+|([a-z0-9]+[-]+[a-z0-9]+))[.])+

Sau đó kết hợp tất cả lại với nhau (ví dụ PHP preg_match):

$pattern = '/^(([a-z0-9]+|([a-z0-9]+[-]+[a-z0-9]+))[.])+(AC|AD|AE|AERO|AF|AG|AI|AL|AM|AN|AO|AQ|AR|ARPA|AS|ASIA|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BIZ|BJ|BM|BN|BO|BR|BS|BT|BV|BW|BY|BZ|CA|CAT|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|COM|COOP|CR|CU|CV|CX|CY|CZ|DE|DJ|DK|DM|DO|DZ|EC|EDU|EE|EG|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GOV|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|ID|IE|IL|IM|IN|INFO|INT|IO|IQ|IR|IS|IT|JE|JM|JO|JOBS|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MG|MH|MIL|MK|ML|MM|MN|MO|MOBI|MP|MQ|MR|MS|MT|MU|MUSEUM|MV|MW|MX|MY|MZ|NA|NAME|NC|NE|NET|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|ORG|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PRO|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|ST|SU|SV|SY|SZ|TC|TD|TEL|TF|TG|TH|TJ|TK|TL|TM|TN|TO|TP|TR|TRAVEL|TT|TV|TW|TZ|UA|UG|UK|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|XN|XN|XN|XN|XN|XN|XN|XN|XN|XN|XN|YE|YT|YU|ZA|ZM|ZW)[.]?$/i';

    if (preg_match, $pattern, $matching_string){
    ... do stuff
    }

Bạn cũng có thể muốn thêm một câu lệnh if để kiểm tra chuỗi mà bạn kiểm tra có ngắn hơn 256 ký tự - http://www.ops.ietf.org/lists/namedroppers/namedroppers.2003/msg00964.html


1
-1 vì điều này khớp với các địa chỉ IP không có thật như là 999.999.999.999.
bdesham

1
"Mặc dù trường hợp này không chiếm các giá trị như 0 trong octet nắm tay và các giá trị lớn hơn 254 (địa chỉ ip) hoặc 255 (netmask)."
Alex Volkov

Tôi thấy rằng bạn đủ điều kiện câu trả lời của bạn, vâng. Tôi đánh giá thấp vì một phần câu trả lời của bạn vẫn không hữu ích.
bdesham

3

Điều đáng chú ý là có các thư viện cho hầu hết các ngôn ngữ làm điều này cho bạn, thường được tích hợp vào thư viện chuẩn. Và những thư viện đó có thể sẽ được cập nhật thường xuyên hơn nhiều so với mã mà bạn đã sao chép câu trả lời Stack Overflow bốn năm trước và quên mất. Và tất nhiên, họ cũng thường phân tích địa chỉ thành một số dạng có thể sử dụng, thay vì chỉ cho bạn một trận đấu với một nhóm.

Ví dụ: phát hiện và phân tích cú pháp IPv4 trong (POSIX) C:

#include <arpa/inet.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
  for (int i=1; i!=argc; ++i) {
    struct in_addr addr = {0};
    printf("%s: ", argv[i]);
    if (inet_pton(AF_INET, argv[i], &addr) != 1)
      printf("invalid\n");
    else
      printf("%u\n", addr.s_addr);
  }
  return 0;
}

Rõ ràng, các chức năng như vậy sẽ không hoạt động nếu bạn đang cố gắng, ví dụ: tìm tất cả các địa chỉ hợp lệ trong tin nhắn trò chuyện, nhưng ngay cả ở đó, có thể dễ dàng hơn khi sử dụng một biểu thức đơn giản nhưng quá nhiệt tình để tìm các kết quả phù hợp, sau đó sử dụng thư viện để phân tích chúng.

Ví dụ: trong Python:

>>> import ipaddress
>>> import re
>>> msg = "My address is 192.168.0.42; 192.168.0.420 is not an address"
>>> for maybeip in re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', msg):
...     try:
...         print(ipaddress.ip_address(maybeip))
...     except ValueError:
...         pass

2
def isValidHostname(hostname):

    if len(hostname) > 255:
        return False
    if hostname[-1:] == ".":
        hostname = hostname[:-1]   # strip exactly one dot from the right,
                                   #  if present
    allowed = re.compile("(?!-)[A-Z\d-]{1,63}(?<!-)$", re.IGNORECASE)
    return all(allowed.match(x) for x in hostname.split("."))

Bạn có thể giải thích regex này? Chính xác, ý nghĩa của (?! -), (? <! -) là gì?
Scit

1
@Scit, những người này đảm bảo rằng nó không bắt đầu hoặc kết thúc bằng ký tự "-" nếu công cụ regex của bạn cho phép họ sử dụng. Ví dụ: từ Python hoặc từ Perl .
YLearn

1

Tôi nghĩ rằng đây là regex xác thực Ip tốt nhất. vui lòng kiểm tra một lần !!!

^(([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))\.){3}([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))$

1
"^((\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])\.){3}(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])$"

1

Điều này hoạt động cho các địa chỉ IP hợp lệ:

regex = '^([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-5][0-5])[.]([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-5][0-5])[.]([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-5][0-5])[.]([0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-5][0-5])$'


0

Đây là một regex mà tôi đã sử dụng trong Ant để lấy IP máy chủ proxy hoặc tên máy chủ ra khỏi ANT_OPTS. Điều này đã được sử dụng để có được IP proxy để tôi có thể chạy thử nghiệm Ant "có thể truy cập được" trước khi định cấu hình proxy cho một JVM rẽ nhánh.

^.*-Dhttp\.proxyHost=(\w{1,}\.\w{1,}\.\w{1,}\.*\w{0,})\s.*$

Đó là một \wquyền ở đó, nó sẽ không chiếm được IP, chỉ có tên máy chủ trong một số tình huống.
Yaron

0

Tôi thấy điều này hoạt động khá tốt cho các địa chỉ IP. Nó xác nhận như câu trả lời hàng đầu nhưng nó cũng đảm bảo ip được cách ly để không có văn bản hoặc nhiều số / số thập phân nằm sau hoặc trước ip.

(? <! \ S) (?: (?: \ D | [1-9] \ d | 1 \ d \ d | 2 [0-4] \ d | 25 [0-5]) \ b |. \ b) {7} (?! \ S)


Tôi đã cố gắng rất nhiều nhưng tôi không thể hiểu 2 điều ở đây. 1. \ b chỉ định ranh giới từ Tại sao chúng ta sử dụng \ b? đó là ranh giới nào? và 2. Tại sao nó chỉ hoạt động cho {7} Từ những gì tôi hiểu, tôi nghĩ nó nên là {4} nhưng, nó không hoạt động. Tùy chọn, bạn có thể nói về lý do tại sao bạn sử dụng một khối không bắt giữ.
Srichakradhar


0

thử cái này:

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

nó hoạt động trong trường hợp của tôi


0

Về địa chỉ IP, có vẻ như có một số tranh luận về việc có nên bao gồm các số không hàng đầu hay không. Nó đã từng là thông lệ và thường được chấp nhận, vì vậy tôi sẽ lập luận rằng chúng nên được gắn cờ là hợp lệ bất kể ưu tiên hiện tại. Ngoài ra còn có một sự mơ hồ về việc liệu văn bản trước và sau chuỗi có nên được xác nhận hay không và, một lần nữa, tôi nghĩ rằng nó nên. 1.2.3.4 là IP hợp lệ nhưng 1.2.3.4.5 thì không và cả phần 1.2.3.4 cũng như phần 2.3.4.5 sẽ không dẫn đến kết quả trùng khớp. Một số mối quan tâm có thể được xử lý với biểu thức này:

grep -E '(^|[^[:alnum:]+)(([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.){3}([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])([^[:alnum:]]|$)' 

Phần không may ở đây là phần regex xác nhận octet được lặp lại là đúng trong nhiều giải pháp được đưa ra. Mặc dù điều này tốt hơn so với các thể hiện của mẫu, sự lặp lại có thể được loại bỏ hoàn toàn nếu các chương trình con được hỗ trợ trong biểu thức chính được sử dụng. Ví dụ tiếp theo cho phép các chức năng đó với việc -Pchuyển đổi grepvà cũng tận dụng chức năng của lookahead và lookbehind. (Tên hàm tôi đã chọn là 'o' cho octet. Tôi có thể đã sử dụng 'octet' làm tên nhưng muốn được ngắn gọn.)

grep -P '(?<![\d\w\.])(?<o>([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(\.\g<o>){3}(?![\d\w\.])'

Việc xử lý dấu chấm thực sự có thể tạo ra một phủ định sai nếu địa chỉ IP nằm trong một tệp có văn bản dưới dạng câu vì khoảng thời gian có thể theo sau mà không phải là một phần của ký hiệu chấm. Một biến thể ở trên sẽ khắc phục điều đó:

grep -P '(?<![\d\w\.])(?<x>([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(\.\g<x>){3}(?!([\d\w]|\.\d))'

0
>>> my_hostname = "testhostn.ame"
>>> print bool(re.match("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$", my_hostname))
True
>>> my_hostname = "testhostn....ame"
>>> print bool(re.match("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$", my_hostname))
False
>>> my_hostname = "testhostn.A.ame"
>>> print bool(re.match("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$", my_hostname))
True

0

Khung mạng mới có các trình khởi tạo khả dụng cho cấu trúc IPv4Address và struct IPv6Address xử lý phần địa chỉ IP rất dễ dàng. Làm điều này trong IPv6 với một regex là khó khăn với tất cả các quy tắc rút ngắn.

Thật không may, tôi không có câu trả lời tao nhã cho tên máy chủ.

Lưu ý rằng khung Mạng là gần đây, vì vậy nó có thể buộc bạn phải biên dịch cho các phiên bản HĐH gần đây.

import Network
let tests = ["192.168.4.4","fkjhwojfw","192.168.4.4.4","2620:3","2620::33"]

for test in tests {
    if let _ = IPv4Address(test) {
        debugPrint("\(test) is valid ipv4 address")
    } else if let _ = IPv6Address(test) {
        debugPrint("\(test) is valid ipv6 address")
    } else {
        debugPrint("\(test) is not a valid IP address")
    }
}

output:
"192.168.4.4 is valid ipv4 address"
"fkjhwojfw is not a valid IP address"
"192.168.4.4.4 is not a valid IP address"
"2620:3 is not a valid IP address"
"2620::33 is valid ipv6 address"

-1

Còn cái này thì sao?

([0-9]{1,3}\.){3}[0-9]{1,3}

Và 9999999999.0.0.9999999999 cũng vậy :) Nhưng đối với hầu hết các lập trình viên, cách tiếp cận ngắn này sẽ đủ.
andreas

3
-1 vì điều này khớp với các địa chỉ IP vô nghĩa (như ghi chú @Shebuka).
bdesham

-1

trên php: filter_var(gethostbyname($dns), FILTER_VALIDATE_IP) == true ? 'ip' : 'not ip'


2
Mặc dù mã này có thể trả lời câu hỏi, nhưng việc giải thích chung với mã làm cho câu trả lời hữu ích hơn nhiều. Vui lòng chỉnh sửa câu trả lời của bạn và cung cấp một số bối cảnh và giải thích.
dùng4642212

Và, trừ khi tôi nhầm, FILTER_VALIDATE_IP chỉ là giá trị PHP.
DonGar

-2

Kiểm tra tên máy chủ như ... mywebsite.co.in, thangaraj.name, 18thangaraj.in, thangaraj106.in, v.v.

[a-z\d+].*?\\.\w{2,4}$

3
-1. OP đã yêu cầu một thứ gì đó được thử nghiệm rất tốt để khớp chính xác với thông số kỹ thuật RFC mới nhất, nhưng điều này không khớp với ví dụ * .museum, trong khi nó sẽ khớp với * .foo. Đây là danh sách các TLD hợp lệ.
bdesham

Tôi không chắc chắn nên đặt dấu cộng vào bên trong lớp ký tự (dấu ngoặc vuông), hơn nữa, có TLD với 5 chữ cái ( ví dụ .expert ).
Yaron

Cách tốt nhất để thực hiện với RFC là sử dụng các chức năng hệ thống / ngôn ngữ. inet_atonLà đủ tốt.
m3nda

-2

Tôi đã nghĩ về mẫu kết hợp regex đơn giản này để khớp địa chỉ IP \ d + [.] \ D + [.] \ D + [.] \ D +


1111.1.1.1 không phải là một ip hợp lệ. Không có cách nào để thực sự kiểm tra định dạng ip nếu bạn không quan tâm đến mạng con. Ít nhất bạn nên quan tâm đến số lần xuất hiện với một cái gì đó giống như ^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}và tất nhiên đó sẽ không phải là cách chính xác. Nếu bạn có một languaje để viết tập lệnh, chắc chắn bạn sẽ có quyền truy cập vào các chức năng mạng của nó. Cách tốt nhất để kiểm tra ip THỰC SỰ là yêu cầu hệ thống chuyển đổi và ip sang đúng định dạng, sau đó kiểm tra true / false. Trong trường hợp Python tôi sử dụng socket.inet_aton(ip). Trường hợp của PHP bạn cần inet_aton($ip).
m3nda

Người dùng Python có thể xem tại đây: gist.github.com/erm3nda/f25439bba66931d3ca9699b2816e796c
m3nda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.