입력한 IP 주소가 형식에 맞는 형태인지 범위 내에 있는 IP 주소인지 체크하는 방법을 알아보겠습니다.
체크 방법은 정규 표현식을 사용하는 방법과 filter_var 함수를 사용하는 방법 2가지를 보도록 하겠습니다.
그리고 IP 주소는 IPv4과 IPv6이 있습니다.
IPv4과 IPv6 각각 체크하는 방법도 같이 보겠습니다.
IP 범위 체크 정규 표현식
먼저 확인해 볼 방법으로는 정규 표현식입니다.
정규 표현식을 사용해 IPv4과 IPv6 샘플을 보겠습니다.
IPv4로 구성된 IP는 아래와 같은 형식으로 되어있습니다.
xxx.xxx.xxx.xxx
주소는 (.) 점으로 구분되어 있으며 xxx는 0~255까지 숫자로 구성되어 있습니다.
즉 0.0.0.0~255.255.255.255 까지로 되어있습니다.
IPv4을 정규식으로 표현하면 아래와 같습니다.
(?:(?:25[0-5]|2[0-4][0-9]|(?:(?:1[0-9])?|[1-9]?)[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|(?:(?:1[0-9])?|[1-9]?)[0-9])
IPv4 예제
<?php
// IP 주소
$ipv4 = '127.0.0.1';
// IPv4 정규 표현식 패턴
$pattern = '/(?:(?:25[0-5]|2[0-4][0-9]|(?:(?:1[0-9])?|[1-9]?)[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|(?:(?:1[0-9])?|[1-9]?)[0-9])/';
// preg_match 함수에 정규 표현식 패턴과 값을 지정
if( preg_match( $pattern, $ipv4 ) ){
echo "'$ipv4'는 형식에 맞는 IP 주소입니다.";
}else{
echo "'$ipv4'는 형식에 맞지 않는 IP 주소입니다.";
}
?>
preg_match 함수에 작성한 정규 표현식 패턴과 값을 설정하여 IP 주소가 범위 내에 있는지 체크하고 있습니다.
이번에는 IPv6 정규 표현식 패턴을 보겠습니다.
IPv6 정규 표현식
((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4})|:))|(([0-9A-Fa-f]{1,4}:){6}(:|((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(:[0-9A-Fa-f]{1,4})))|(([0-9A-Fa-f]{1,4}:){5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:)(:[0-9A-Fa-f]{1,4}){0,4}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(:(:[0-9A-Fa-f]{1,4}){0,5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))(%.+)?
IPv6은 자릿수도 많고 16진수로 구성되어 있다 보니 정규 표현식 패턴이 상당히 길어집니다.
IP 범위 체크 filter_var
이번에는 filter_var 함수를 사용하여 IP 주소가 범위 내에 있는지 확인하는 방법을 보겠습니다.
먼저 IPv4 예제를 보겠습니다.
IPv4 filter_var 예제
<?php
// IP 주소
$ipv4 = '127.0.0.1';
// preg_match 함수에 정규 표현식 패턴과 값을 지정
if( filter_var( $ipv4, FILTER_VALIDATE_IP ) ){
echo "'$ipv4'는 형식에 맞는 IP 주소입니다.";
}else{
echo "'$ipv4'는 형식에 맞지 않는 IP 주소입니다.";
}
?>
filter_var 함수에 대상 값과 FILTER_VALIDATE_IP를 지정해주는 것으로 IP 범위 체크가 가능합니다.
filter_var함수와 FILTER_VALIDATE_IP를 사용하면 IPv6도 체크가 가능합니다.
<?php
// IP 주소
$ipv6 = '2001:0db8:1234:5678:90ab:cdef:0000:0000';
// preg_match 함수에 정규 표현식 패턴과 값을 지정
if( filter_var( $ipv6, FILTER_VALIDATE_IP ) ){
echo "'$ipv6'는 형식에 맞는 IP 주소입니다.";
}else{
echo "'$ipv6'는 형식에 맞지 않는 IP 주소입니다.";
}
?>
정리
PHP에서 IP 주소가 범위 내에 있는 값인지 체크하는 방법을 확인했습니다.
정규 표현식과 filter_var 함수를 사용하여 예제를 봤습니다.
IPv6는 정규 표현식으로 체크하면 패턴이 너무 길어지게 됩니다.
가능하면 filter_var 함수를 사용하는 것이 좋습니다.
댓글