Programming/PHP

php5 폼 전송 값 및 문자 체크하기

달나라민군 2010. 10. 5. 11:07
출처: http://it.moyiza.com/?mid=programming&category=72&document_srl=2540

아스키 코드 값을 통해 구현했습니다
정규식 쓰면 더 간단하게 코딩이 되겠지만
아무리 테스트 해봐도

정규식 보다 아스키체크가 더 빠르더라고요
그래서 아스키 코드로만 체크했음당


아무튼
폼값으로 전송된 값을 체크 하기 위한
클래스 입니다.

더 필요한 기능들은 알아서 추가 ㅎㅎㅎ


# 폼체크및문자체크용

01.$error_msg[1] = '데이타 값을 입력하세요';
02.  
03.$error_msg[2] = '공백없이 입력하세요';
04.  
05.$error_msg[3] = '숫자는 입력할 수 없습니다';
06.  
07.$error_msg[4] = '특수문자는 입력할 수 없습니다';
08.  
09.$error_msg[5] = '첫글자는 영문으로 입력하세요';
10.  
11.$error_msg[6] = '한글은 입력할 수 없습니다';
12.  
13.$error_msg[7] = '문자를 입력할 수 있는 범위를 초과할 수 없습니다';
14.  
15.$error_msg[8] = '연속해서 같은 문자를 사용할 수 없습니다';
16.  
17.$error_msg[9] = '값을 정확하게 입력하세요';
18.  
19.$error_msg[10] = '이메일 주소를 정확하게 입력하세요';
20.  
21.$error_msg[11] = "'-'를 제외한 이메일 도메인 주소에 특수문자는 입력할 수 없습니다";
22.  
23.$error_msg[12] = "홈페이지 주소는 '/,-,_,.,~,:'를 제외한 특수문자는 입력할 수 없습니다";



001.<?php
002.  
003./** ======================================================
004.  
005.| @Author    : 김종관 
006.  
007.| @Email    : apmsoft@gmail.com
008.  
009.| @HomePage    : http://www.apmsoftax.com
010.  
011.| @Editor    : Eclipse(default)
012.  
013.| @UPDATE    : 2010-02-04
014.  
015.----------------------------------------------------------*/
016.  
017.  
018.# purpose : 문자를 체크(Ascii 문자 코드를 활용하여) 한다 / preg,ereg 정규식 보다 훨 빠름
019.  
020.class IsChecker{
021.  
022.    private $str;
023.  
024.    private $len = 0;
025.  
026.      
027.  
028.    public function __construct($s){
029.  
030.        if(!empty($s)){
031.  
032.            $this->str = trim($s);
033.  
034.            $this->len = strlen($s);
035.  
036.        }
037.  
038.    }
039.  
040.      
041.  
042.    # null 값인지 체크한다 [ 널값이면 : true / 아니면 : false ]
043.  
044.    public function isNull(){
045.  
046.        $result = false;
047.  
048.        $asciiNumber = Ord($this->str);
049.  
050.        if(empty($asciiNumber)) return true;
051.  
052.    return $result;
053.  
054.    }
055.  
056.      
057.  
058.  
059.    # 문자와 문자사이 공백이 있는지 체크 [ 공백 있으면 : true / 없으면 : false ]
060.  
061.    public function isSpace(){
062.  
063.        $result = false;
064.  
065.        $str_split    = split("[[:space:]]+",$this->str);
066.  
067.        $count = count($str_split);    
068.  
069.        for($i=0; $i<$count; $i++){
070.  
071.            if($i>0){
072.  
073.                $result = true;
074.  
075.                break;
076.  
077.            }
078.  
079.        }
080.  
081.    return $result;
082.  
083.    }
084.  
085.      
086.  
087.    # 연속적으로 똑같은 문자는 입력할 수 없다  [ 반복문자 max 이상이면 : true / 아니면 : false ]
088.  
089.    # ex : 010-111-1111,010-222-1111 형태제한
090.  
091.    # max = 3; // 반복문자 3개 "초과" 입력제한
092.  
093.    public function isSameRepeatString($max=3){
094.  
095.        $result = false;
096.  
097.        $sameCount = 0;
098.  
099.        $preAsciiNumber = 0;
100.  
101.        for($i=0; $i<$this->len; $i++){
102.  
103.            $asciiNumber = Ord($this->str[$i]);
104.  
105.            if( ($preAsciiNumber == $asciiNumber) && ($preAsciiNumber>0) ) $sameCount += 1;
106.  
107.            else $preAsciiNumber = $asciiNumber;
108.  
109.                  
110.  
111.            if($sameCount==$max){
112.  
113.                $result = true;
114.  
115.                break;
116.  
117.            }
118.  
119.        }
120.  
121.    return $result;
122.  
123.    }
124.  
125.      
126.  
127.    # 숫자인지 체크 [ 숫자면 : true / 아니면 : false ]
128.  
129.    # Ascii table = 48 ~ 57
130.  
131.    public function isNumber(){
132.  
133.        $result = true;
134.  
135.        for($i=0; $i<$this->len; $i++){
136.  
137.            $asciiNumber = Ord($this->str[$i]);
138.  
139.            if($asciiNumber<47 || $asciiNumber>57){
140.  
141.                $result = false;
142.  
143.                break;
144.  
145.            }
146.  
147.        }
148.  
149.    return $result;
150.  
151.    }
152.  
153.  
154.    # 영문인지 체크 [ 영문이면 : true / 아니면 : false ]
155.  
156.    # Ascii table = 대문자[75~90], 소문자[97~122]
157.  
158.    public function isAlphabet(){
159.  
160.        $result = true;
161.  
162.        for($i=0; $i<$this->len; $i++){
163.  
164.            $asciiNumber = Ord($this->str[$i]);
165.  
166.            if(($asciiNumber>64 && $asciiNumber<91) || ($asciiNumber>96 && $asciiNumber<123)){}
167.  
168.            else{ $result = false; }
169.  
170.        }
171.  
172.    return $result;
173.  
174.    }
175.  
176.  
177.    # 영문이 대문자 인지체크 [ 대문자이면 : true / 아니면 : false ]
178.  
179.    # Ascii table = 대문자[75~90]
180.  
181.    public function isUpAlphabet(){
182.  
183.        $result = true;
184.  
185.        for($i=0; $i<$this->len; $i++){
186.  
187.            $asciiNumber = Ord($this->str[$i]);
188.  
189.            if($asciiNumber<65 || $asciiNumber>90){
190.  
191.                $result = false;
192.  
193.                break;
194.  
195.            }
196.  
197.        }
198.  
199.    return $result;
200.  
201.    }
202.  
203.  
204.    # 영문이 소문자 인지체크 [ 소문자면 : true / 아니면 : false ]
205.  
206.    # Ascii table = 소문자[97~122]
207.  
208.    public function isLowAlphabet(){
209.  
210.        $result = true;
211.  
212.        for($i=0; $i<$this->len; $i++){
213.  
214.            $asciiNumber = Ord($this->str[$i]);
215.  
216.            if($asciiNumber<97 || $asciiNumber>122){
217.  
218.                $result = false;
219.  
220.                break;
221.  
222.            }
223.  
224.        }
225.  
226.    return $result;
227.  
228.    }
229.  
230.      
231.  
232.    # 한글인지 체크한다 [ 한글이면 : true / 아니면 : false ]
233.  
234.    # Ascii table = 128 > 
235.  
236.    public function isKorean(){
237.  
238.        $result = true;
239.  
240.        for($i=0; $i<$this->len; $i++){
241.  
242.            $asciiNumber = Ord($this->str[$i]);
243.  
244.            if($asciiNumber<128){
245.  
246.                $result = false;
247.  
248.                break;
249.  
250.            }
251.  
252.        }
253.  
254.    return $result;
255.  
256.    }
257.  
258.      
259.  
260.    # 특수문자 입력여부 체크 [ 특수문자 찾으면 : true / 못찾으면 : false ]
261.  
262.    # allow = "-,_"; 허용시킬 
263.  
264.    # space 공백은 자동 제외
265.  
266.    public function isEtcString($allow){
267.  
268.        # 허용된 특수문자 키
269.  
270.        $allowArgs = array();
271.  
272.        $tmpArgs = (!empty($allow)) ? explode(',',$allow) : '';
273.  
274.        if(is_array($tmpArgs)){
275.  
276.            foreach($tmpArgs as $k => $v){
277.  
278.                $knumber = Ord($v);
279.  
280.                $allowArgs['s'.$knumber] = $v;
281.  
282.            }
283.  
284.        }
285.  
286.          
287.  
288.        $result = false;
289.  
290.        for($i=0; $i<$this->len; $i++){
291.  
292.            $asciiNumber = Ord($this->str[$i]);
293.  
294.            if(array_key_exists('s'.$asciiNumber, $allowArgs) === false){
295.  
296.                if( ($asciiNumber<48) && ($asciiNumber != 32) ){ $result = true; break; }
297.  
298.                else if($asciiNumber>57 && $asciiNumber<65){ $result = true; break; }
299.  
300.                else if($asciiNumber>90 && $asciiNumber<97){ $result = true; break; }
301.  
302.                else if($asciiNumber>122 && $asciiNumber<128){ $result = true; break; }
303.  
304.            }
305.  
306.        }
307.  
308.    return $result;
309.  
310.    }
311.  
312.      
313.  
314.    # 첫번째 문자가 영문인지 체크한다[ 찾으면 : true / 못찾으면 : false ]
315.  
316.    public function isFirstAlphabet(){
317.  
318.        $result = true;
319.  
320.        $asciiNumber = Ord($this->str[0]);
321.  
322.        if(($asciiNumber>64 && $asciiNumber<91) || ($asciiNumber>96 && $asciiNumber<123)){}
323.  
324.        else{ $result = false; }
325.  
326.    return $result;
327.  
328.    }
329.  
330.      
331.  
332.    # 문자길이 체크 한글/영문/숫자/특수문자/공백 전부포함
333.  
334.    # min : 최소길이 / max : 최대길이
335.  
336.    public function isStringLength($min,$max){
337.  
338.        $strCount = 0;
339.  
340.        for($i=0;$i<$this->len;$i++){
341.  
342.            $asciiNumber = Ord($this->str[$i]);
343.  
344.            if($asciiNumber<=127 && $asciiNumber>=0){ $strCount++; } 
345.  
346.            else if($asciiNumber<=223 && $asciiNumber>=194){ $strCount++; $i+1; }
347.  
348.            else if($asciiNumber<=239 && $asciiNumber>=224){ $strCount++; $i+2; }
349.  
350.            else if($asciiNumber<=244 && $asciiNumber>=240){ $strCount++; $i+3; }
351.  
352.        }
353.  
354.          
355.  
356.        if($strCount<$min) return false;
357.  
358.        else if($strCount>$max) return false;
359.  
360.        else return true;
361.  
362.    }
363.  
364.      
365.  
366.    # 두 문자가 서로 같은지 비교
367.  
368.    public function equals($s){
369.  
370.        $result = true;
371.  
372.        if(is_string($eStr)){ # 문자인지 체크
373.  
374.            if(strcmp($this->str, $s)) $result= false;
375.  
376.        }else{
377.  
378.            if($this->str != $s ) $result = false;
379.  
380.        }
381.  
382.    return $result;
383.  
384.    }
385.  
386.}
387.  
388.?>



001.   
002.<?php
003.  
004./** ======================================================
005.  
006.| @Author    : 김종관 
007.  
008.| @Email    : apmsoft@gmail.com
009.  
010.| @HomePage    : http://www.apmsoftax.com
011.  
012.| @Editor    : Eclipse(default)
013.  
014.| @UPDATE    : 2010-02-04
015.  
016.----------------------------------------------------------*/
017.  
018.  
019.# purpose : 폼 전송값 체크하기 위함
020.  
021.class FormChecker{
022.  
023.    private $phones = array('070','1588','080','02','032','041','042');
024.  
025.    private $cellphones = array('010','011','016','017','018','019');
026.  
027.  
028.    # 프라퍼티 값 입력
029.  
030.    public function setArrayParams($propertyName,$val){
031.  
032.        if(property_exists(__CLASS__,$propertyName)){
033.  
034.            $this->{$propertyName}[] = $val;
035.  
036.        }
037.  
038.    }
039.  
040.      
041.  
042.    # 프라퍼티 값 리턴
043.  
044.    public function getArrayParams($propertyName){
045.  
046.        if(property_exists(__CLASS__,$propertyName)){
047.  
048.            return $this->{$propertyName};
049.  
050.        }
051.  
052.    }
053.  
054.      
055.  
056.    # 이름
057.  
058.    public function chkName($krname,$value){
059.  
060.        $isChceker = new IsChecker($value);
061.  
062.        if($isChceker->isNull()){ throw new ErrorException($krname,1); }
063.  
064.        if($isChceker->isSpace()){ throw new ErrorException($krname,2); }
065.  
066.        if($isChceker->isNumber()){ throw new ErrorException($krname,3); }
067.  
068.        if($isChceker->isEtcString('')){ throw new ErrorException($krname,4); }
069.  
070.    }
071.  
072.      
073.  
074.    # 아이디
075.  
076.    public function chkUserid($krname,$value){
077.  
078.        $isChceker = new IsChecker($value);
079.  
080.        if($isChceker->isNull()){ throw new ErrorException($krname,1); }
081.  
082.        if($isChceker->isSpace()){ throw new ErrorException($krname,2); }
083.  
084.        if(!$isChceker->isStringLength(6,14)){ throw new ErrorException($krname,7); }
085.  
086.        if(!$isChceker->isFirstAlphabet()){ throw new ErrorException($krname,5); }
087.  
088.        if($isChceker->isKorean()){ throw new ErrorException($krname,6); }
089.  
090.        if($isChceker->isEtcString('')){ throw new ErrorException($krname,4); }
091.  
092.    }
093.  
094.      
095.  
096.    # 비밀번호
097.  
098.    public function chkPassword($krname,$value){
099.  
100.        $isChceker = new IsChecker($value);
101.  
102.        if($isChceker->isNull()){ throw new ErrorException($krname,1); }
103.  
104.        if($isChceker->isSpace()){ throw new ErrorException($krname,2); }
105.  
106.        if(!$isChceker->isStringLength(6,30)){ throw new ErrorException($krname,7); }
107.  
108.        if($isChceker->isKorean()){ throw new ErrorException($krname,6); }
109.  
110.        if($isChceker->isEtcString('')){ throw new ErrorException($krname,4); }
111.  
112.    }
113.  
114.      
115.  
116.    # 일반전화 및 팩스 (070-3456-5677, 1588-1566, 080-2323-2322)
117.  
118.    public function chkPhone($krname,$value){
119.  
120.        $isChceker = new IsChecker($value);
121.  
122.        if($isChceker->isNull()){ throw new ErrorException($krname,1); }
123.  
124.        if($isChceker->isSpace()){ throw new ErrorException($krname,2); }
125.  
126.        if($isChceker->isEtcString('-')){ throw new ErrorException($krname,4); }
127.  
128.        if($isChceker->isSameRepeatString(2)){ throw new ErrorException($krname,8); }
129.  
130.  
131.        $args = explode('-',$value);
132.  
133.        if(array_search($args[0],$this->phones) === false) throw new ErrorException($krname,9);
134.  
135.    }
136.  
137.  
138.    # 휴대전화 (010-1234-2344)
139.  
140.    public function chkCellPhone($krname,$value){
141.  
142.        $isChceker = new IsChecker($krname,$value);
143.  
144.        if($isChceker->isNull()){ throw new ErrorException($krname,1); }
145.  
146.        if($isChceker->isSpace()){ throw new ErrorException($krname,2); }
147.  
148.        if($isChceker->isEtcString('-')){ throw new ErrorException($krname,4); }
149.  
150.        if($isChceker->isSameRepeatString(2)){ throw new ErrorException($krname,8); }
151.  
152.          
153.  
154.        $args = explode('-',$value);
155.  
156.        if(array_search($args[0],$this->cellphones) === false) throw new ErrorException($krname,9);
157.  
158.    }
159.  
160.      
161.  
162.    # 이메일 sed_-23@apmsoftax.com
163.  
164.    public function chkEmail($krname,$value){
165.  
166.        $isChceker = new IsChecker($value);
167.  
168.        if($isChceker->isNull()){ throw new ErrorException($krname,1); }
169.  
170.        if($isChceker->isSpace()){ throw new ErrorException($krname,2); }
171.  
172.        if($isChceker->isKorean()){ throw new ErrorException($krname,6); }
173.  
174.        if($isChceker->isEtcString('@,-,_')){ throw new ErrorException($krname,4); }
175.  
176.          
177.  
178.        # @ 체크
179.  
180.        $an64 = strpos('@',$value);
181.  
182.        if($an64 === false){
183.  
184.            throw new ErrorException($krname,10);
185.  
186.        }else{
187.  
188.            # "." 확인 및 도메인 체크
189.  
190.            $tmpstr = substr($s,($an64+1));
191.  
192.            $an46 = strpos('.',$tmpstr);
193.  
194.            if($an46 === false){
195.  
196.                throw new ErrorException($krname,10);
197.  
198.            }else{
199.  
200.                $domainName = substr($tmpstr,0,($an46-1));
201.  
202.                $domainExt    = substr($tmpstr,($an46+1));
203.  
204.                  
205.  
206.                # 도메인네임 체크
207.  
208.                $isChceker = new IsChecker($value);
209.  
210.                if($isChceker->isEtcString('-_'))throw new ErrorException($krname,11);
211.  
212.            }            
213.  
214.        }
215.  
216.    }
217.  
218.      
219.  
220.    # 홈페이지 주소 체크
221.  
222.    public function chkUrl($krname,$value){
223.  
224.        $isChceker = new IsChecker($value);
225.  
226.        if($isChceker->isNull()){ throw new ErrorException($krname,1); }
227.  
228.        if($isChceker->isSpace()){ throw new ErrorException($krname,2); }
229.  
230.        if($isChceker->isKorean()){ throw new ErrorException($krname,6); }
231.  
232.        if($isChceker->isEtcString('/,-,_,.,~,:')){ throw new ErrorException($krname,12); }
233.  
234.    }
235.  
236.}
237.  
238.  
239.?>


폼체킹하기

01.<?php
02.  
03.  
04.  
05.$path = $_SERVER['DOCUMENT_ROOT'];
06.  
07.include_once $path.'/config/config.php';
08.  
09.  
10.  
11.try{
12.  
13.    $formcheck = new FormChecker;
14.  
15.      
16.  
17.    # 이름체크
18.  
19.    $formcheck->chkName('[이름]','나당');
20.  
21.      
22.  
23.    # 일반전화 체크
24.  
25.    $formcheck->setArrayParams('phones','054');
26.  
27.    $formcheck->chkPhone('[전화번호]','054-1113-2342');
28.  
29.      
30.  
31.    # 아이디
32.  
33.    $formcheck->chkUserid('[아이디]','0apsmfe');
34.  
35.      
36.  
37.}catch(ErrorException $e){
38.  
39.    $out->outPrintln('error_mesage : '.$e->getMessage().' '.$error_msg[$e->getCode()]);
40.  
41.}
42.  
43.  
44.  
45.?>