print_r()은 변수에 대한 정보를 사람이 읽을 수 있는 방법으로 표시합니다. string, integer, float이 주어지면, 값을 그대로 출력합니다. array가 주어지면, 키와 요소를 알아볼 수 있는 형태로 표현합니다. object에 대해서도 비슷하게 표현합니다. var_dump()와는 달리, print_r()과 var_export()는 PHP 5에서 protected 및 private 속성도 보여줍니다.
print_r()은 배열 포인터를 마지막으로 이동합니다. 처음으로 되돌리려면 reset()을 사용하십시오.
참고: 4.3.0 이전 버전의 PHP에서 print_r()의 출력을 가져오려면, 출력 제어 함수를 이용하십시오.
참고: PHP 4.0.4 이전에는, 주어진 array이나 object가 자기 자신에의 직접적/비직접적 참조를 포함하고 있으면 print_r()은 무한 루프에 빠졌습니다. 예를 들면, print_r($GLOBALS)가 해당합니다. $GLOBALS는 자기 자신에의 참조를 포함하고 있는 전역 변수이기 때문입니다.
'foreach'문을 이용하지 않더라도 'for'문이나 'while'문을 이용해 출력 할 수 도있지만 'foreach'문을 이용해서 좀더 편리하게 배열변수를 출력해 보자.
'foreach'문은 'while'문처럼 원소의 개수만큼 문장을 반복 실행하게된다.
* 인덱싱배열 출력 * $members = array("홍길동","임꺽정","허준"); foreach($members as $name){ //배열의 값을 foreach문을 이용해 출력 echo "이름: ".$name."<br>"; }
- $members 값을 순차적으로 출력 한다.
* 연관배열 출력 * $score = array("홍길동"=>93,"임꺽정"=>90,"허준"=>88); foreach($score as $name=>$result){ //연관배열의 키와 값출력하기 echo $name.": ".$result."<br>"; }
- 연관배열 $score 로부터 하나씩 각 원소의 키와 값을 가져와 원소의 키는 변수 $name에 저장하고 원소의 값은 변수 $reault 에 각각 저장하여 이들값을 출력한다.
- 인덱싱배열과 인덱싱배열을 같이 써보자.
숫자로 된 키를 갖는 원소와 문자열로 된 키를 갖는 원소가 함께존재하는배열도가능하다. $fruit = array('사과',"원숭이"=>'바나나',"제주도"=>'귤','감'); echo $fruit[0].'<br>'; echo $fruit["원숭이"].'<br>'; echo $fruit[1];
-처음 '사과'는 키를 지정해주지 않았으므로 $fruit[0]이란 값으로 참조할수있다.
-바나나는 문자열키 '원숭이'로 참조한다.
-마지막 4번째 원소인 '감'역시 키를 지정해주지 않았다 그 사이에 문자열키가
있지만 이럴땐 숫자로된 가장큰 정수형키보다 1큰값을 키로 갖는다.
* 다차원 배열 *
- 배열안에 또다른배열이 중첩적으로 있는것을 다차원 배열이라 한다. $member = array(array("이름"=>'홍길동',"나이"=>24,"성별"=>"남"), array("이름"=>'성춘향',"나이"=>20,"성별"=>"여")); echo $member[0]["이름"].'<br>'; echo $member[1]["이름"];
- 배열속의 첫번째배열은 키를 지정해주지않았으므로 0값을 갖는다.
알고 싶은 값에 들어가는 요소들에 따른 값 $_SERVER[SERVER_NAME] : 현재 호스트의 이름 $_SERVER[DOCUMENT_ROOT] : 현재 파일이 실행중인 document root 디렉토리 (웹으로 접속되는 루트) $_SERVER[PHP_SELF] : document root 를 기준으로 한 현재 실행 파일 이름 $_SERVER[SCRIPT_FILENAME] : 현재 실행 파일의 절대경로 $_SERVER[SCRIPT_NAME] : 현재 실행 파일의 이름 $_SERVER[REQUEST_URI] : 현재 실행 파일을 사용한 URI (get 파라미터를 포함한다.) $_SERVER[HTTP_REFERER] : 현재실행파일을 호출한 곳의 주소 (해당 파일로 링크가 연결된 주소) $_SERVER[REMOTE_ADDR] : 접속한 사용자의 IP
2. $_GET, $_POST
$_GET get 방식으로 넘어온 변수들 $_POST post 방식으로 넘어온 변수들
3. $_SESSION, $_COOKIE
$_SESSION 세션에 저장된 변수들 $_COOKIE 쿠키에 저장된 변수들
4. $_FILES
<input type="file" name="filename"> 을 통해 업로드된 파일의 정보
$_FILES['filename']['name'] : 파일명 $_FILES['filename']['type'] : 파일 타입 $_FILES['filename']['tmp_name'] : 업로드되어 임시 저장된 파일의 절대경로 $_FILES['filename']['error'] : 업로드 에러 코드 $_FILES['filename']['size'] : 파일 사이즈(bytes)
$result1 = ereg("s",$text);
echo "s 문자가 있는지 검사:".$result1."<br>"; //검색한 문자(열)가 있는 경우, 1을 반환하고, 없으면 아무값도 반환하지 않는다.
echo "S 문자가 있는지 검사:".$result."<br>"; //검색한 문자(열)가 있는 경우, 1을 반환하고, 없으면 아무값도 반환하지 않는다.
$result2 = ereg("A",$text);
echo "A 문자가 있는지 검사:".$result2."<br>";
echo "ereg 함수의 경우, 대소문자를 구별함. eregi 함수를 이용해 대소문자 구별없이 확인하기<br>";
$result3 = eregi("s",$text);
echo "s 문자가 있는지 검사:".$result3."<br>"; //eregi 를 이용해 대소문자 구별없이 검사
?>
<br>
특수문자들이 정규 표현식에서 어떻게 사용하는지 보기<br>
--------------
사용예제 내용
[abc] a,b,c 로 이루어진 문자열
[a-c] a 에서 c 까지의 문자로 이루어진 문자열
[a-z] a 에서 z 까지의 문자로 이루어진 문자열
[A-Z] 대문자 A 에서 Z 까지의 문자로 이루어진 문자열
[a-zA-Z] 소문자 a 에서 z 까지, 대문자 A 에서 Z 까지의 문자로 이루어진 문자열
[0-9] 0 에서 9 까지의 숫자(문자?) 로 이루어진 문자열
[!@#_0-9] !,@,#,_ 와 0 에서 9 까지의 문자로만 이루어진 문자열
-------------
<br>
바로 앞 문자열의 개수를 지정하는 중괄호 {}
중괄호는({}) 는 바로 앞의 문자나 문자열의 개수를 지정해 주는 특수문자로, 사용 형식은 다음과 같다.
<br>
--------------
사용예제 내용
a{2}b aab 를 가진 문자열을 사용할 수 있다. 즉 (2) 는 {} 앞에 있는 문자 a 의 개수가 2개인 것을 의미
a{2,}b a 의 개수가 최소 2개 이상인 문자열을 의미. aab, aaab, aaaab 모두 사용할 수 있다.
--------------
<br>
시작과 끝을 알리는 ^,$
^,$ 는 문자열의 시작과 끝을 알리는 특수문자이다.
만약 abc 라는 문자열이 있으면 이 문자열은 a 로 시작하여 c 로 끝난다.
이때 정규 표현식에서 a 부터 검사하라는 의미로 a 앞에 문자열의 시작을 알리는 ^ 를,
c 의 끝에 문자열의 끝을 알리는 $ 를 붙여서 정규 표현식을 시작한다.
^,$ 를 표로 정리하면 다음과 같다.
<br>
---------------
사용예제 내용
^abc a 에서부터 문자가 시작되는 것을 알린다.
abc$ c 가 문자열의 끝임을 알린다.
---------------
<br>
문자열 사용 막기:
사용할 수 있는 문자열을 지정하는 정규 표현식의 문자는 [] 이다.
이와 반대로 특정 문자열을 사용할 수 없도록 지정하고 싶다면, 지정하는 대괄호 [] 사이에 삿갓(^) 표시를 입력하면 된다.
예를 들어 [^123] 과 같이 사용하면 1,2,3 숫자는 문자열로 사용할 수 없다.
<br>
<br>
<?
$text = "test1234";
$result = ereg("^[a-z]{4}[0-9]{4}$",$text);
echo $result."<br>"; // 1 출력
/*
[a-z]{4} 의 의미는, 위의 문자가 알파벳 a 에서 z 까지 4개의 문자로 이루어진 것인지 검사하는 양식이다.
test 는 소문자 a 에서 z 까지 4개의 알파벳 문자로 이루어진 것이고, 1234 는 0 에서 9 까지의 숫자중에서 4개로 이루어진 값이므로,
True 인 1 을 반환한다.
*/
?>
<br><br>
바로 앞 문자열의 반복을 의미하는 *,+,? 문자
*,+,? 문자들은 해당 문자의 바로 앞 문자를 의미하며, 그 문자가 하나 이상이라는 것을 의미한다.
이 세 개의 문자열은 비슷한 정의를 가지고 있지만, 실제 사용하는 데에는 약간의 차이를 갖는다.
다음은 이 세 가지 특수문자열을 정의하고 실제 사용하는 예를 나타낸 표이다.
<br>
--------------------------------------
사용예제 결과값 내용
a*b b,ab,aab,aaab,aaaab... b 앞에 a 가 없거나 하나 이상 존재하는 모든 문자열
a+b ab,aab,aaab,aaaab... b 앞에 a 가 최소한 하나 이상은 존재하는 모든 문자열
ab?c abc, ac a 와 c 사이에 b 가 하나 있거나 혹은 없는 문자열
--------------------------------------
<br>
정규 표현식에서 특수문자를 사용하기 위한 역슬래시(\)
정규 표현식에서 입력받은 문자열의 타당성을 검사하기 위한 특수문자가 아니라,
실제 사용해야 할 특수문자가 있을 때는 그 문자 앞에 역슬래시(\)로 해당 문자열을 이스케이프해야 한다.
특수문자를 이스케이프 한다는 이유는, 우리가 이메일이나 홈페이지 주소 등을 정규 표현식으로 검사할 때
실제 'small@small.co.kr' 와 같이 이메일 주소에 사용하는 특수문자 '.' 는 그대로 살려야 하기 때문이다.
<br>
정규 표현식 특수문자를 이용하여 이메일 주소 체크하기
<br>
$ereg = "^[_0-9a-zA-Z]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)+$";
<br>
예시 이메일주소)
small@small.co.kr
<br>
맨앞의 사용자 계정은 영문 소문자와 대문자, 숫자 그리고 음수 기호(-), 언더바(_), 점(.)과 같은
특수문자의 조합으로 구성되므로, 다음과 같은 정규 표현식을 작성할 수 있다.
<br>
^[_0-9a-zA-Z-]
<br>
정규 표현식에서 ^ 문자는 문자열의 시작을 알리는 것이다.
처음 문자열인 사용자 계정 이름의 시작을 0 에서 9 까지의 숫자나 소문자 a 에서 소문자 z, 대문자 A 에서 대문자 Z 까지 사용하게 지정.
그런데, 사용자 계정에서
.small@small.co.kr 이나 small.@small.co.kr 처럼 사용자 계정의 이름을 점(.) 으로 시작하거나 끝낼수는 없으므로,
아래의 하나의 패턴을 더 추가한다.
<br>
^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*
<br>
여기서 마지막 문자열 * 는 바로 앞에 있는 괄호의 반복 () 을 뜻한다.
따라서, small, small.co, small.co.kr 등의 값들이 모두 참이 된다.
하지만, 실제 이런 사용자 계정은 없으므로,
입력한 사용자 계정 이름을 가져오고 이메일 계정을 의미하는 @ 를 붙여준다.
<br>
다시 이메일 주소의 서버 이름의 체크 정규 표현식을 만든다.
사용자 계정 이름을 검사하는 정규 표현식과 서버 이름 체크의 정규 표현식이 거의 비슷하므로,
다음과 같이 앞부분을 복사하여 하나 더 만들고, 서버 이름에는 언더바(_) 가 업으므로, 언더바(_) 를 지운다.
또, 서버 이름을 체크하는 정규 표현식이 끝나면 더 이상 이메일 주소가 없기 때문에 맨 마지막에 문자열의 끝을 알려주는 $ 문자를 입력한다.
<br>
^[_0-9a-zA-Z-]+(\.0-9a-zA-Z-]+*@(0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)+@
<br>
이제 정규 표현식과 eregi 함수만으로 이메일 주소의 타당성을 검사할수 있다.
<br>
표현식에서 () 는 그 부분들을 묶어주는 역할을 하는 듯 하다(일반 연산에서와 같은 방식으로)
단, ()* 로 사용하면,() 안의 내용을 반복 한다는 뜻.
<br><br>
<?
$ereg = "^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)+$";
$email = ".asdf.ae@asdf.co.kr";
$result = eregi($ereg,$email);
if($result==1){
echo "입력하신 이메일 주소 $email 는 정상적인 이메일 주소입니다";
}else{
echo "$email 는 정규 표현식에 어긋나는 이메일 주소 입니다";
}
?>
<br>
정규식에 일치하면 1 을 반환. 아니면 반환값 없음.
<br>
위의 이메일 주소가 정상적이라고 출력됨(정규 표현식 불완전)