2010-12-01 1 views
2

PHP의 IP 주소와 일치합니다. warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in C:\xampp\htdocs\index.php on line 5IPv6에서 PHP preg_match 문제가 발생했습니다.

5 호선이 if (preg_match("\b(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]?)\.(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]?)\b", $ip)) return true;

어떤 문제가 있습니다 : 나는 오류를 받고 있어요 그러나

function checkIP($ip){ 
    $ip = trim($ip); 
    if (preg_match("\b(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]?)\.(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]?)\b", $ip)) return true; 
    $v6pattern = "/ 
(\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,6}\Z)| 
(\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}\Z)| 
(\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}\Z)| 
(\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}\Z)| 
(\A([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}\Z)| 
(\A([0-9a-f]{1,4}:){1,6}(:[0-9a-f]{1,4}){1,1}\Z)| 
(\A(([0-9a-f]{1,4}:){1,7}|:):\Z)| 
(\A:(:[0-9a-f]{1,4}){1,7}\Z)| 
(\A((([0-9a-f]{1,4}:){6})(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)| 
(\A(([0-9a-f]{1,4}:){5}[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)| 
(\A([0-9a-f]{1,4}:){5}:[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)| 
(\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)| 
(\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,3}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)| 
(\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,2}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)| 
(\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,1}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)| 
(\A(([0-9a-f]{1,4}:){1,5}|:):(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)| 
(\A:(:[0-9a-f]{1,4}){1,5}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z) 
/x"; 
    if (preg_match($v6pattern, $ip)) return true; 
    return false; 
} 

: 그래서 내 검사가 있습니까?

+2

이런 세상에! 그게 복잡 할 필요가있을거야? –

+0

정규식은 일을 위해 실제로 적합하지 않습니다 – Breezer

+0

. 그에 따라 내 의견이 삭제되었습니다. –

답변

5

구분 기호 사이에 정규 표현식을 사용해야합니다. Manual을 확인하십시오. filters을 사용하여 휠 재발생을 방지 할 수도 있습니다. 예를 들면 :

filter_var($var, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); //for IP's V6 

filter_var($var, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); //for IP's V4 
2

처음으로 preg_match을 호출 할 때 사용한 정규식의 구분 기호가 없습니다.

PHP는 preg_match에있는 정규식이 한 쌍의 구분 기호로 묶일 것으로 기대합니다. 문자 /은 두 번째 호출 preg_match에도 사용되는 구분 기호로 널리 사용됩니다. #, |, @, ~, !과 같은 문자를 사용할 수도 있습니다. 내가 정규식을 건너 뛰고 젠드에서 validate 모듈을 사용

if (preg_match("#\b(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]?)\.(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]?)\b#", $ip)) return true; 
       ^                                        ^
5

:

는 다음과 같이 누락 된 delimier를 추가합니다. 당신이 게시 한 정규 표현식보다 훨씬 쉽고 강력합니다.

$validator = new Zend_Validate_Ip(); 

    if ($validator->isValid($ip)) { 

     // ip appears to be valid 

    } else { 

     // ip is invalid; print the reasons 

    } 
0

당신은 IPv4와 IPv6 모두가 예를 들어, inet_ntopinet_pton을 통해 공급하는 것이 더 편리 할 것입니다 주소 괜찮다면

function is_ip($address) { 
    $packed = inet_pton ($address); 
    if (FALSE == $packed || FALSE === inet_ntop ($packed)) { 
    return FALSE; 
    } 
    return TRUE; 
} 
0

는 IPv4 당신이 간단하게 사용할 수있는 주소를 일치 시키려면 :

하나가 바로 IP 주소의 유효성을 검사하는 큰 정규식 괴물이다

preg_match("/\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}/", $string, $result);