[regex] DNS 호스트 이름 또는 IP 주소와 일치하는 정규식?



Answers

smink 의 호스트 이름 정규식은 호스트 이름 내의 개별 레이블 길이 제한을 준수하지 않습니다. 유효한 호스트 이름 내의 각 레이블은 63 옥텟을 초과 할 수 없습니다.

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]))*$"

첫 번째 줄의 끝에있는 백 슬래시 (위)는 긴 줄을 분할하기위한 유닉스 셸 구문입니다. 그것은 정규 표현식 자체의 일부가 아닙니다.

다음은 한 줄로 된 정규 표현식입니다.

^([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]))*$

또한 호스트 이름의 총 길이가 255자를 넘지 않아야 함을 별도로 확인 해야합니다 . 자세한 내용은 RFC-952 및 RFC-1123을 참조하십시오.

Question

법적인 DNS 호스트 이름이나 IP 주소와 일치하는 정규 표현식을 가진 사람이 있습니까?

95 %의 시간 동안 작동하는 서버를 작성하는 것은 쉽지만 DNS 호스트 이름에 대한 최신 RFC 사양과 정확하게 일치하는 테스트를 받기를 바라고 있습니다.




나는이 간단한 정규 표현식과 일치하는 IP 주소 일치 패턴에 대해 생각했다. \ d + [.] \ d + [.] \ d + [.] \ d +




"^((\\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])$"



상위 게시물을 수정할 수없는 것 같습니다. 여기에 내 답변을 추가하겠습니다.

hostname - 쉬운 대답, egrep 예제 - http : //www.linuxinsight.com/how_to_grep_for_ip_addresses_using_the_gnu_egrep_utility.html

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

이 경우는 주먹 옥텟에서 0과 같은 값을 고려하지 않으며 254 (ip addres) 또는 255 (netmask)보다 큰 값을 설명합니다. if 문이 도움이 될 수도 있습니다.

합법적 인 dns 호스트 이름에 관해서는 인터넷 호스트 네임 (인트라넷이 아님) 만 검사한다면, 다음과 같이 썼습니다. 쉘 / PHP가 섞여 있지만 정규 표현식으로 사용 가능해야합니다.

먼저 ietf 웹 사이트로 이동하여 법적 수준 1 도메인 이름 목록을 다운로드하고 구문 분석합니다.

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)"

그렇게하면 .com .org 또는 .ca와 같은 최상위 도메인 이름의 적법성을 검사하는 좋은 코드를 얻을 수 있습니다.

그런 다음 여기에있는 지침에 따라 표현의 첫 부분을 추가하십시오 - http : //www.domainit.com/support/faq.mhtml?category=Domain_FAQ&question=9 (영숫자 조합 및 '-'기호, 대시는 사용할 수 없습니다 옥텟의 시작 또는 끝.

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

그런 다음 모두 함께 넣으십시오 (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
    }

if 문을 추가하여 검사하는 문자열이 256 자보다 짧은 지 http://www.ops.ietf.org/lists/namedroppers/namedroppers.2003/msg00964.html




public string GetPublicIP()
    {
        var direction = string.Empty;
        var request = WebRequest.Create("http://checkip.dyndns.org/");

        using (var response = request.GetResponse())
        using (var stream = new StreamReader(response.GetResponseStream()))
        {
            direction = stream.ReadToEnd();
        }

        var matches = matchIp.Match(direction);
        return matches.Captures.Count != 0 ? matches.Captures[0].Value : string.Empty;
    }



>>> 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



이 시도:

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

그것은 내 경우에 효과가있다.




PHP에서 : filter_var(gethostbyname($dns), FILTER_VALIDATE_IP) == true ? 'ip' : 'not ip' filter_var(gethostbyname($dns), FILTER_VALIDATE_IP) == true ? 'ip' : 'not ip'




나는 이것이 IP 주소에 꽤 잘 작동 함을 발견했다. 그것은 최상위 답변과 같은 유효성을 검사하지만 IP가 격리되어 있는지 확인하므로 텍스트 나 숫자 / 소수가 ip 이전 또는 이후에 없습니다.

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




나는 이것이 최고의 IP 검증 정규식이라고 생각한다. 한번 확인해보세요 !!!

^(([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]))$



Related



Tags

regex   dns