2013-08-04 2 views
1

나는 신용 카드 필드에 각각 네 자리가 들어 있는지 확인하려고합니다.preg_match()는 매개 변수가 주어진 긴 문자열 일 것으로 예상합니다.

function creditcard ($creditCard1,$creditCard2,$creditCard3,$creditCard4) 
{ 
    $regexp="/^[0-9]{4}$/"; 

    if (preg_match($regexp,$creditCard1,$creditCard2,$creditCard3,$creditCard4))//line 18 
    { 
     return TRUE; 
    } 
    else 
    { 
     echo'<script type="text/javascript">alert("Enter a valid credit card number.")</script>'; 
     return FALSE; 
    } 
} 

    $creditCard1=$_POST['creditCard1']; 
    $creditCard2=$_POST['creditCard2']; 
    $creditCard3=$_POST['creditCard3']; 
    $creditCard4=$_POST['creditCard4']; 
    $creditcard=creditcard($creditCard1,$creditCard2,$creditCard3,$creditCard4); 

이 오류가 발생합니다.

Warning: preg_match() expects parameter 4 to be long, string given in C:\xampp\htdocs\SFASC2\aa.php on line 18 

내가 잘못하고있는 것을 고칠 수 없어. 고마워. 이 같은 많은 질문이 있지만, 나에게 해결책을주는 것도 없습니다 .. 그리고 나는 벽에 머리를 치고있었습니다. 의심 할 여지없이 명백한 것을 내려다 보았습니다.

+2

[preg_match'] (http://php.net/preg_match)의 참조 페이지, 특히 함수의 매개 변수를 살펴보십시오. – Gumbo

+0

실제 신용 카드를 취급하고 있습니까? 그것은 무섭다. 신용 카드와 관련된 모든 보안 요구 사항을 알고 있습니까? – DCoder

+0

오, 진정해. 이것이 임무라고 말하면 아무런 문제가 없습니다. 상당수의 사람들이 이처럼 많은 경험을 통해 실제 민감한 데이터를 실제로 처리하려고합니다. 그래서 나는 물었습니다. – DCoder

답변

3

preg_match 한 번에 하나의 제목 만 선택하십시오. 다음 코드

보십시오 : 당신이 입력의 배열에 대해 하나의 정규식을 적용하고 있기 때문에 더 나은

function creditcard($nums) 
{ 
    $regexp="/^[0-9]{4}$/"; 

    for ($i = 0; $i < 4; $i++) 
     if (! preg_match($regexp, $nums[$i])) 
      return FALSE; 
    return TRUE; 
} 

$creditCard1 = $_POST['creditCard1']; 
$creditCard2 = $_POST['creditCard2']; 
$creditCard3 = $_POST['creditCard3']; 
$creditCard4 = $_POST['creditCard4']; 

$ok = creditcard([$creditCard1, $creditCard2, $creditCard3, $creditCard4]); 
if (! $ok) 
    echo '<script type="text/javascript">alert("Enter a valid credit card number.")</script>'; 
+0

@Skippy, preg_match :'int preg_match (string $ pattern, string $ subject [, array & $ matches [, int $ flags = 0 [, int $ offset = 0]]]) 시그니처를보십시오. 그것은 오직 한 과목 만받습니다. – falsetru

+1

@Skippy, 문자열이 아닌'creditcard'에 배열 전달. – falsetru

2

그것이 사용 사례에 대한 preg_grep 대신 preg_match을 사용합니다. preg_grep의 주요 이점은 입력을 반복하지 않아도된다는 것입니다. 코드 아래 고려 :

function creditcard($arr) { 
    static $re="/^\d{4}$/"; 
    return (preg_grep($re, $arr) === $nums); 
} 

$result = creditcard(['5423', '1234', '1234', '1234']); 
// returns true 
$result = creditcard(['5423', 'A234', '1234', '1234']); 
// returns false 

PS : 그 변수가 &는 한 번만 초기화 선언해야하기 때문에 내가 static$re을 선언했다.

관련 문제