PHP 프로그래밍

본문 바로가기
사이트 내 전체검색


Web Programming >> PHP Programming
[목차]
제3장 PHP에서 꼭 알아두어야 할 함수

    3. 문자열 처리 함수

게시판이나 자료실 등 대부분의 웹 프로그램을 개발할 때 가장 많이 사용하게 되는 함수는 바로 문자열을 처리하는 함수이다. 특히 게시판처럼 사용자가 입력한 문자열을 체크하고 이 값을 데이터베이스에 저장한 후 다시 검색된 데이터를 추출하여 출력하는 방식의 웹 프로그램에서는 사용자의 요청에 의해 전송되는 데이터가 대부분 문자열의 형태이기 때문에 이러한 문자열의 처리가 상당히 중요한 문제가 된다. 따라서 다른 함수보다도 이 문자열 처리 함수를 많이 알고 있는 것이 게시판이나 BBS 개발 시에는 매우 큰 도움이 된다.

addslashes 함수

addslashes() 함수는 다음과 같이 정의된다.

 

 string addslashes(string str);

   문자열 str이 작은 따옴표(')나 큰 따옴표(), 또는 역슬래시(\)와 같은 문자를 담고 있을 경우 이 문자 앞에 역슬래시(\)문자를 추가하여 전체 문자열을 반환한다.

예를 들어, 사용자가 게시판과 같은 폼을 통해 입력한 문자열을 데이터베이스내 sample이라는 테이블의 comment 필드에 저장한다고 하면 보통 아래와 같이 SQL의 INSERT 질의어를 통해 데이터가 테이블에 저장된다.

 

 INSERT INTO sample (comment) VALUES ('안녕하세요? 이완철입니다.!');

위의 실행 결과 테이블 sample 내의 comment 필드에는 "안녕하세요? 이완철입니다!" 라는 문자열이 저장된다.

 

그러나 만일 사용자가 위에서 이완철대신 '이완철'과 같이 따옴표가 포함된 문자열을 입력했다면 아래와 같은 INSERT문은 사용자가 입력한 문자열을 제대로 저장하지 못하는 결과를 가져온다.

 

 INSERT INTO sample (comment) VALUES('안녕하세요? '이완철'입니다!');

위의 실행 결과 테이블 SAMPLE 내의 COMMENT 필드에는 "안녕하세요? '이완철'입니다!"라는 문자열이 아니라 "안녕하세요? 입니다!"라는 부분적인 문자열만 저장되어 버리고 만다.

 

이러한 현상이 발생하는 이유는 위의 SQL 문을 보면 알 수 있듯이 사용자가 입력한 문자열에 포함되어 있는 따옴표가 VALUES() 안에서 입력 데이터를 구분하는 역할을 하기 위해 쓰인 따옴표와 함께 사용되어 서로 구별이 되지 않고 있기 때문이다. 따라서 사용자가 입력한 따옴표와 특수 문자로 쓰인 따옴표를 구분하기 위해서는 사용자가 입력한 문자열의 따옴표 앞에 역슬래시(\)를 붙여서 해당 따옴표가 특수 문자가 아닌 순수한 하나의 글자임을 알려주어야 한다. 아래의 SQL문을 보자.

 

 INSERT INTO sample (comment) VALUES('안녕하세요? \'이완철\'입니다.!');

위의 질의어 실행 결과 테이블 sample 내의 comment 필드에는 사용자가 입력한 문자열 "안녕하세요? '이완철' 입니다!"가 그대로 입력된다.

 addslashes() 함수는 바로 이렇게 데이터베이스 질의어(SQL) 사용시 따옴표와 같은 문자의 중복으로 인한 오류를 피하기 위해서 사용자가 입력한 문자열에 작은 따옴표나 큰 따옴표, 역슬래시와 같은 문자가 포함되어 있을 경우 이들 특수 문자가 문자 자체의 의미로서 해석될 수 있도록 해당 문자 앞에 역슬래시(\)를 붙여주는 함수이다. 이를 '특수 문자를  escape시킨다' 라고 한다.

 

 

 <?

        $comment = "안녕하세요? '이완철'입니다!";

        echo("addslashes()함수 호출전 : $comment<p>");

        

        $comment = addslashes($comment);

        echo("addslashes()함수 호출후 : $comment<p>");        

?>

 

[예제2.8] addslashes() 함수의 역할

 

[예제2.8]은 addslashes() 함수의 효과를 보여준다. 그 샐행 결과는 다음과 같다.

 

 addslashes() 함수 호출전 : 안녕하세요? '이완철'입니다!

 addslashes() 함수 호출후 : 안녕하세요? ??'이완철??'입니다!

addslashes() 함수를 호출하기 전 따옴표(')를 포함했던 문자열이 함수 호출 후 따옴표 앞에 역슬래시 문자가 붙어 출력된 것을 알 수 있다. addslashes() 함수는 보통 게시판에서 사용자가 입력한 값을 질의어를 통해 데이터베이스에 저장하기 전에 호출한다.

 

stripslashes 함수

stripslashes() 함수든 다음과 같이 정의된다.

 

 string stripslashes(string str);

   addslashes()함수를 통해 역슬래시 처리가 된 문자에서 역슬래시(\) 문자를 제거하여 원 상태로 되돌린다.

즉, \'는 '로 되돌린다.

stripslashes() 함수는 addslashes() 함수의 반대 기능을 수행하는 함수로서 게시판의 게시물을 수정하기 위해 addslashes() 함수 호출 후 저장되었던 문자열을 원래의 문자열로 되돌리고자 할 때 호출한다.

 

 

 <?

        $comment = "안녕하세요? '이완철'입니다!";

        echo("addslashes()함수 호출전 : $comment<p>");

        

        $comment = addslashes($comment);

        echo("addslashes()함수 호출후 : $comment<p>");        

        

        $comment = stripslashes($comment);

        echo("stripslashes()함수 호출후 : $comment<p>");

 ?>

 

[예제2.9] stripslashes() 함수는 addslashes() 함수와 반대 기능을 수행한다.

 

[예제2.9]의 결과는 다음과 같다.

 

 addslashes() 함수 호출전 : 안녕하세요? '이완철'입니다!

 addslashes() 함수 호출후 : 안녕하세요? ??'이완철??'입니다!

 stripslashes() 함수 호출후 : 안녕하세요? '이완철' 입니다.

 

htmlspecialchars 함수

htmlspecialchars() 함수는 다음과 같이 정의된다.

 

 string htmlspecialchars(string string);

   이 함수는 사용자가 게시판이나 방명록에서 HTML 코드를 포함하는 문자열을 입력, 전송했을 때 이것이 하이퍼링크로 연결되지 않고 입력한 문자열이 그대로 출력되도록 하는 역할을 한다.

htmlspecialchars() 함수는 다음과 같은 특수 문자들을 문자열로 인식할 수 있도록 바꾸어 준다.

 

 '&' 는 '&amp;' 로 바꾼다.

 ''는 '&quot;' 로 바꾼다.

 '<'는 '&lt;' 로 바꾼다.

 '>'는 '&gt;' 로 바꾼다.

예를 들어, 사용자가 게시판의 입력 양식을 통해 <a href="http://www.kornux.com">kornux home

page</a>와 같이 HTML 코드를 포함하는 문자열을 입력하면 해당 게시물을 조회할 때 <a href="http:

//www.kornux.com">kornux homepage</a> 라는 문자열대신 kornux homepage라는 하이퍼 링크가 표시된다. 그러나 사용자가 입력한 문자열을 htmlspecialchars()함수의 인자로 주어 그 결과를 출력하면 하이퍼링크가 연결되지 않고 사용자가 입력함 문자열 즉, <a href="http://www.kornux.com">kornux homepage</a>가 그대로 출력된다.

 

따라서 게시판이나 방명록에 HTML 코드를 허용하지 않고자 할 경우에는 폼을 통해 넘어오는 문자열을 htmlspecialchars() 함수로 받아 처리하면 된다.

 

nl2br 함수

nl2br() 함수는 다음과 같이 정의된다.

 

 string nl2br(string string);

   문자열 string에 포함된 개행 문자를 모두 <BR>태그로 바꾸어준다.

좀더 정확히 표현하면 nl2br() 함수는 인자로 전달된 문자열에서 개행 문자를 찾아내 그 개행 문자 앞에 <BR> 태그를 삽입하여 전체 문자열을 반환한다.

예로 게시판의 입력 폼에 사용자가 두 줄 이상의 긴 글을 적어 전송하면 이를 보여주는 코드에서는 사용자가 입력한 문자열에 nl2br() 함수를 적용하여야 브라우저를 통해 HTML 문서로 볼 때 사용자가 입력한 그대로 개행 처리된 결과를 볼 수 있게 된다.

 

 

 <?

      

   echo("[nl2br() 함수호출 전]<br>");

   echo("$comment<p>");

 

   $res = nl2br($comment);

 

   echo("[nl2br() 함수호출 후]<br>");

   echo("$res<p>");

 

 ?>

 

[예제2.11] nl2br() 함수의 사용

 

echo 함수

echo() 함수의 정의는 다음과 같다.

 

 echo(string arg1, string[argn]...);

   echo() 함수는 인자로 전해준 문자열을 출력한다.

echo() 함수는 지금껏 보아왔듯이 인자로 전해준 문자열을 출력하며 일반 문자열과 변수를 같이 사용할 수 있다.

 

 

 <?

 $str = "안녕하세요?";

 echo("출력결과 : $str");     // 출력결과 : 안녕하세요?

 ?>

 

echo()와 같은 함수로는 print() 함수도 있다.

 

sprintf 함수

sprintf() 함수의 정의는 다음과 같다.

 

 sprintf(string format, mixed [args]...);

   포맷 문자열을 통해 지정해준 포맷으로 문자열을 반환한다.

sprintf() 함수는 C에서의 사용법과 비슷하게 지정해 준 포맷에 맞게 문자열을 반환한다. 아래의 예제를 보면 쉽게 이해가 갈 것이다.

 

 

 <?

 

   $a = 18.2;

   $b = 7.4;

   

   $sum = $a + $b;                               // $sum = 25.6

   $ext = $a - $b;                                // $ext = 10.8

    

   $res = sprintf("%d", $sum);                        // $res = 25

   echo("$res<br>");

   

   $res = sprintf("%f", $sum);                        // $res = 25.600000

   echo("$res<br>");   

   

   $res = sprintf("%04d", $sum);                      // $res = 0025

   echo("$res<br>");

   

   $res = sprintf("%04.2f", $sum);                     // $res = 0025.60

   echo("$res<br>");   

 

   $res = sprintf("%03.2f - %0.2f", $sum, $ext);          // 025.60 - 10.80

   echo("$res<br>");   

   

   $res = sprintf("%d - %c", 97, 97);                  // 97-a

   echo("$res<br>");   

   

 ?>

 

[예제2.12] sprintf() 함수의 출력 형식 지정

 

sprintf()함수는 두 번째 인자를 받아 첫 번째 인자로 설정한 포맷에 맞게 바꾸어 해당 문자열을 반환한다.

 

9행의 %d는 변수 $sum의 값을 정수로 출력한다. 12행의 %f는 $sum의 값을 부동소수점으로 출력한다. 숫자의 경우 그 값을 지정한 폭으로 출력할 수도 있다. 따라서 변수 $sum의 값 '25'는 '0025'로 출력된다.

 

부동소수점의 경우 소수점 이하의 자릿수를 제한할 수 있다. 18행의 %04.2f는 부동소수점으로 출력하되 앞부분은 네자리, 빈공간은 0으로, 소수점 이하는 두 자리까지 출력하라는 의미이다. 따라서 '0025.60'이라는 값이 출력된다. 포맷을 지정할 때에는 21행과 같이 포맷 문자열(위에서 %d와 %c)의 수와 인자($sum과 $ext)의 수가 일치해야 한다. 24행은 정수 97을 ASCII코드로 변환하여 출력한 예이다.

 

printf 함수

printf() 함수의 정의는 다음과 같다.

 

 int printf(srting format, mixed [args]...);

   지정할 수 있는 포맷에 따라 문자열을 출력하여 사용 가능한 포맷은 sprintf()의 경우와 같다.

 

 

 <?

   $a = 18.2;

   $b = 7.4;

   

   $sum = $a + $b;   

   printf("%02.2f과 %02.2f의 합은 정수값으로 %'x4d입니다!", $a,$b,$sum);

 ?>

 

[예제2.13] printf() 함수의 사용

 

6행의 실행 결과는 다음과 같다.

 

 18.20와 07.40의 합은 정수값으로 xx25입니다!

6행의 %'x4d는 세 자리 정수로 출력하되 빈 공간은 x로 출력하라는 의미이다. 앞의 예제에서는 빈 공간을 0으로 출력했는데 0대신 다른 문자로 출력하려면 'x와 같이 출력하려는 문자 앞에 작은 따옴표(')를 붙인다.

 

explode 함수

explode() 함수의 정의는 다음과 같다.

 

 array explode(string seperator, string string);

   seperator로 string 문자열을 분리하여 배열로 반환한다.

explode() 함수는 문자열을 지정해준 구분자로 분리하여 배열에 저장한다.

 

 

 <?

   $string = "one two threee four five";

   $arr = explode(" ", $string);

   while(list($key,$val) = each($arr)) {

      echo("\$arr[$key] : $val<br>");

   }

 ?>

 

[예제2.14] explode() 함수의 사용

 

실행 결과는 다음과 같다.

 

 $arr[0] : one

 $arr[1] : two

 $arr[2] : three

 $arr[3] : four

 $arr[4] : five

3행에서 explode("",$string)는 문자열 "one two three four five"를 공백 문자로 구분했을 때 나누어지는 문자열들을 배열 $arr에 저장한다. 4행에서 6행은 앞에서 많이 보아왔던 배열의 요소를 출력하는 루틴이다. 문자열이 "one two three four five"이므로 공백 문자에 의해 나누면 "one"과 "two", "three", "four", "five"의 다섯 개 문자열이 생기며 실행 결과 이 값들이 배열의 요소로 들어가게 된다.

 

implode 함수

implode() 함수는 다음과 같이 정의된다.

 

 string implode(array pieces, string glue);

   배열 pieces의 각 요소를 문자열 glue로 연결한 전체 문자열을 반환한다.

implode() 함수는 explode() 함수와 정반대 기능을 수행하는 함수로 explode() 함수가 문자열을 지정해 준 구분자로 나누어 배열에 담았다면 implode() 함수는 각 배열의 원소를 지정해준 구분자로 연결하여 전체 문자열을 반환한다.

 

 

 <?

   $arr = array("one", "two", "three", "four", "five");

   

   $res = implode("/", $arr);

   echo("$res");

 ?>  

 

[예제2.15] implode() 함수의 사용

 

2행에서 배열 변수 $arr를 정의하였다. 4행의 implode("",$arr)는 배열 변수 $arr의 모든 원소를 '/'로 연결한 전체 문자열을 $res에 저장하라는 의미이다. 따라서 변수 $res는 문자열 "one/two/three/four/five"가 된다.

 

join 함수

join() 함수는 다음과 같이 정의된다.

 

 string join(array pieces, string glue);

   join() 함수는 implode() 함수와 동일한 기능을 수행한다. 즉, 함수 implode(/,$arr)의 호출은 join(/,$arr)의 호출과 동일한결과를 갖는다.

 

split 함수

split() 함수는 다음과 같이 정의된다.

 

 array split(string pattern, string string, int [limit]);

   주어진 문자열(string)을 정규 표현식의 패턴(pattern)에 따라 분리하여 배열에 저장한다.

split() 함수도 explode() 함수처럼 문자열을 구분자로 분리하여 배열에 저장한다. 그러나 explode() 함수와 달리 split() 함수는 구분자로서 정규 표현식을 이용할 수 있기 때문에 좀더 다양한 패턴을 검출할 수가 있으므로 유용하다. 아래의 예를 보자.

 

 

 <?

   $str = "이완철:김영아:길현수:박현영";

   

   $arr = split(":", $str,3);

   

   while(list($key,$val) = each($arr)) {

      echo("\$arr[$key] : $val<br>");

   }

   

   echo("<br>");

   $str = "이완철92김영아91길현수87박현영97";   

   

   $arr = split("[0-9]{2}", $str);

   

   while(list($key,$val) = each($arr)) {

      echo("\$arr[$key] : $val<br>");

   }   

 ?>  

 

[예제2.16] split() 함수는 정규 표현식을 이용할 수 있다.

 

해석 결과는 다음과 같다.

 

 $arr[0] : 이완철

 $arr[1] : 김영아

 $arr[2] ; 길현수:박현영

 

 $arr[0] : 이완철

 $arr[1] : 김영아

 $arr[2] : 길현수

 $arr[3] : 박현영

 $arr[4] :

 

※ 정규 표현식이란?

리눅스의 VI 에디터나 윈도우 운영체제에서 사용되는 노트패드, 울트라에디터와 같은 대부분의 편집기는 보통 문서 내에서 문자열을 검색(search)하고 이 검색된 문자열을 지정한 문자열로 치환하는 치환 기능(replace)을 가지고 잇다. 그리고 우리는 이 검색과 치환 기능을 이용하여 쉽게 원하는 단어나 문자를 찾아 다른 문자열로 바꿀 수 있다.

그러나 만일 특정 단어나 문자열이 아닌, 어떠한 패턴을 갖는 문자열을 검색하고자 할 때에는 어떤가? 얘를 들면, "simple"이라는 단어만을 찾는 것이 아니라 "smile", "see"와 같이 "s"로 시작해서 "e"로 끝나는 모든 문자열을 검색해야 하는 경우라면 특정 문자나 단어를 지정해서 검색하는 방법만으로는 찾고자 하는 모든 문자열을 검색해낼 수가 없게 된다. 바로 이럴 때 사용하게 되는 것이 정규 표현식(Regular Expression)이다. 즉, 찾고자 하는 문자열들이 가진 공통된 패턴을 정규 표현식을 이용해 표현, 지정함으로써 이 패턴과 일치하는 모든 문자열을 쉽게 검색해 낼 수가 있게 되는 것이다.

 

[예제 2.16]에서 4행은 문자열 "이완철:김영아:길현수:박현영"를 ":"로 분리하여 배열 $arr에 저장하되 마지막 인자로 준 3이라는 값은 분리된 문자열을 세 개까지 얻겠다는 의미이다. 세 번째 배열 원소인 $arr[2]는 "길현수:박현영"이 되며 ":"에 의해 더 이상 나누어지지 않는다.

 

만일 세 번째 인자가 생략되어 있는 경우에는 전체 문자열을 구분자로 모두 분리하여 배열에 저장한다.

 

13행의 split() 함수는 정규 표현식을 사용하여 좀더 다양하게 문자열을 분리할 수 있음을 보여준다. 11행의 문자열 $str은 "이완철92김영아91길현수87박현영97"인데 이 문자열에서 이름만을 뽑아 배열에 저장하려 한다면 앞에서의 explode() 함수로는 불가능하다. 이때는 split() 함수 호출시 구분자로서 문자열이 아닌 정규표현식을 전달하면 이름만을 뽑아낼 수 있다.

 

13행의 split("[0-9]{2}", $str)에서 [0-9]{2}는 뒤에서 다루게 될 정규 표현식으로 두 자리 숫자를 의미하는 정규 표현이다. 따라서 전체 문자열을 두 자리 숫자로 구분하여 나누면 " 이완철", "김영아", "길현수", "박현영", 그리고 마지막 문자열이 두 자리 숫자이므로 공백 문자열 ""도 배열 $arr의 마지막 원소가 된다.

 

strcmp 함수

strcmp() 함수의 정의는 다음과 같다.

 

 int srtcmp(string str1, string str2);

   두 개의 문자열 str1과 str2를 비교한다.

두 개의 문자열 str1과 str2이 일치하면 0을 그렇지 않으면 0이 아닌 값을 반환한다. 따라서 보통 문자열을 비교할 때 쓴다.

 

 

 <?

   $str1 = "안녕?";

   

   if(!strcmp($str1,"안녕?")) {

      echo("문자열이 일치합니다.");

   }

   

   if($str1 == "안녕?") {

      echo("문자열이 일치합니다.");

   }    

 

   if(!strcmp("abc", "ABC")) {

      echo("문자열이 일치합니다.");

   }       

 ?>

 

[예제2.17] 문자열을 비교할 때 strcmp() 함수를 사용한다.

 

4행에서 두 문자열이 일치할 경우 strcmp() 함수는 0을 반환하므로 두 문자열이 일치할 경우 5행이 실행된다. 물로 8행과 같이 '==' 연산자를 이용하여 두 문자열이 같은지 여부를 확인할 수 있지만 문자열의 비교 시에는 strcmp() 함수를 사용하는 것이 더 안전하다. 또한 strcmp() 함수는 12행에서와 같이 대소 문자를 구분하므로 abc와 ABC는 같지 않다고 판단한다.

 

substr 함수

substr() 함수의 정의는 다음과 같다.

 

 string substr(string string, int start, int [lenght]);

   전체 문자열 string중 start와 length에 의해 추출된 문자열을 반환한다.

 

 

 <?

 

 $res = substr("abcdefg",1);

 echo("$res<br>");

 

 $res = substr("abcdefg",1,3);

 echo("$res<br>");

 

 $res = substr("abcdefg",-3);

 echo("$res<br>");

 

 $res = substr("abcdefg",-3,2);

 echo("$res<br>");

 

 $res = substr("abcdefg",3,-1);

 echo("$res<br>");

 

 $res = substr("abcdefg",1,-3);

 echo("$res<br>");

 

 $res = substr("abcdefg",-6,-1);

 echo("$res<br>");

 

 $res = substr("abcdefg", 0,-1);

 echo("$res<br>");

 

 ?>

 

[예제2.18] substr() 함수의 사용

 

substr() 함수에서 start 값은 추출할 문자열이 시작되는 위치를 가리킨다. 이 값이 양수이면 앞부분부터이고 음수이면 뒷부분부터이다. 시작하는 숫자는 앞에서부터일 경우는 0, 뒤에서부터일 경우는 1부터 시작한다. 즉, 문자열 abcdefg에서 start 값이 양수일 경우 a가 0, b가 1, c가 2번째 문자의 순서가 되고 start 값이 음수일 경우 g가 1, f가 2, e가 3번째 문자가 된다.

 

3행은 문자열 abcdefg에서 앞에서 1번째 문자인 b부터 끝까지의 문자열 bcdefg를 반환한다.

 

6행에서 두 번째 인자인 length는 추출할 문자열의 길이를 의미한다. 따라서 6행의 경우 앞에서 1번째 문자(b)를 시작점으로 하여 3자리의 문자를 추출하므로 bcd를 반환한다.

만일 start 값이 음수이면 시작점은 문자열의 뒤에서부터 계산된다. 9행을 보면 start 값이 3이므로 뒤에서 세 번째 문자(e)부터 시작하여 length가 생략되었으므로 끝까지의 문자열(efg)을 반환한다.

 

12행의 경우 start 값이 3이므로 뒤에서 세 번째 문자(e)부터 시작하여 두 개의 문자(ef)를 반환한다.

 

만일 length 값이 음수일 경우에는 선택하는 것이 아니라 문자열의 끝에서 그만큼을 잘라내는 것을 의미한다.

 

15행의 경우 앞에서 세 번째(d) 문자부터 시작하여 끝까지를 반환하되 length가 1이므로 끝에서 한 문자(g)를 잘라내어 결과적으로 문자열 def를 반환한다. 18행의 경우 앞에서 1번째 문자9b)부터 시작하여 뒤에서 세 개의 문자를 잘라낸 문자열 bcd를 반환한다.

 

21행의 경우 start 값이 음수이므로 뒤에서부터 6번째 문자(b)부터 끝까지를 (bcdefg) 반환하되 length가 1이므로 끝의 한 문자(g)를 제외한 나머지 문자열 bcdef를 반환한다.

 

24행도 length가 1이므로 해당 문자열의 마지막 한 글자를 제외한 나머지 문자열을 반환한다.

 

strchr 함수

strchr() 함수의 정의는 다음과 같다.

 

 string strchr(string haystack, string needle);

   문자열 haystack을 검사하여 문자열 needle이 처음으로 나타나는 위치부터 끝까지를 반환한다. 만일 needle 문자열을 찾지 못하면 false를 반환한다.

 

 

 <?

 $str1 = "abcdefghijklmn";

 $res = strchr($str1,"j");

 echo("res : $res<br>");

 

 $res = strchr($str1,"jm");

 echo("res : $res<br>");

 ?>

 

[예제2.19] strchar() 함수의 사용

 

3행은 문자열 변수 $str1에서 문자열'j'가 있는지를 검사하여 j가 발견된 부분부터 끝까지, 즉 jklmn을 반환한다. 그러나 6행과 같이 발견되지 않은 문자열의 경우에는 공백 문자열, 즉 false를 반환한다.

 

strstr 함수

strstr() 함수의 정의는 다음과 같다.

 

 string strstr(string haystack, string needle);

   strstr() 함수는 strchr() 함수와 동일한 기능을 수행한다.

 

strchr 함수

strchr() 함수의 정의는 다음과 같다.

 

 string strstr(string haystack, string needle);

   문자열 haystack을 검사하여 문자열 needle이 마지막으로 나타나는 위치부터 끝까지의 문자열을 반환한다.

앞의 strchr() 함수가 찾고자 하는 문자열이 처음으로 나타나는 위치부터 끝까지를 반환하는 반면, strchr() 함수는 마지막으로 나타나는 위치부터 끝가지를 반환한다.

 

 

 <?

 

 $str = "abcdefgihijklmn";

 $res = strchr($str,"f");

 echo("res : $res<br>");

 $res = strrchr($str,"f");

 echo("res : $res<br>");

 

 $str = "abcdefghijklmnabcdefghijklmn";

 $res = strchr($str,"f");

 echo("res : $res<br>");

 $res = strrchr($str,"f");

 echo("res : $res<br>");

 ?>

 

[예제2.20] strchr() 함수의 사용

 

4행의 strchr($str, "f")는 문자열 abcdefghijklmnabcdefghijklmn에서 'f'가 처음으로 나타나는 위치부터 끝까지를 반환하므로 fghijklmnabcdefghijklmn를 반환한다.

그러나 6행의 strchr($str, "f") 함수는 'f'가 마지막으로 나타나는 위치, 즉, 여기서는 두 번째 f부터 시작하여 끝까지의 문자열 fghijklmn을 반환한다.

 

 

 <?

 

 printf("%d -> %c",10,10);

 $text = "Line 1\nLine 2\nLine 3";

 $str = strrchr($text,10);

 echo("str : $str");

 $last = substr( strrchr( $text, 10 ), 1 );

 echo("$last - ");

 

 ?>

 

[예제2.21] substr() 과 strchr() 함수의 사용

 

위 예제에서는 문자열 처리 함수 printf와 substr, strchr 함수를 함께 사용하였다. 3행에서 printf로 정수 10을 ASCII 코드로 출력하면 정수 10은 개행 문자('\n')임을 알 수 있다. 5행의 strchr($text,10)은 숫자로 10, 즉 개행 문자가 마지막으로 나타나는 위치부터 마지막까지의 문자열을 반환한다. 따라서 5행의 실행 결과 문자열 $str에는 "\nLine 3"이 할당된다. 7행의 substr(strchr($text,10),1) 부분은 문자열 "\nLine 3"의 1번째 문자부터 끝까지를 반환하므로 결구 r0번째 문자인 개행 문자를 제외한 문자열 "Line 3"이 변수 $last에 반환된다.

 

strpos 함수

strpos() 함수는 다음과 같다.

 

 int strpos(string haystack, string needle, int [offset]);

   검색 대상 문자열 haystack에서 찾고자 하는 문자열 needle이 처음으로 나타나는 위치를 반환한다.

strchr() 함수가 문자열을 검색하여 처음으로 나타나는 위치부터의 문자열을 반환하는 반면에 strpos() 함수는 문자열대신 처음으로 나타나는 위치를 숫자로 반환한다. 이때 숫자는 0부터 시작한다.

 

 

 <?

 $str1 = "AaBbCcDdAaBb";

 

 $res = strpos($str1,"C");

 echo("res : $res<br>");             // 4

 

 $res = strchr($str1,"C");

 echo("res : $res<br>");             // "CcDdAaBb

 

 $res = strpos($str1,97);

 echo("res : $res<br>");             //1

 

 $res = strpos($str1,"C",5);          // false

 echo("res : $res<br>");

 ?>

 

[예제2.22] strpos() 함수의 사용

 

4행은 문자열 AaBbCcDdAaBb에서 'C'가 처음으로 나타나는 위치를 반환한다. 위치는 0부터 시작하므로 'C는 문자열의 4번째 위치가 된다.

 

그에 비해 7행은 strchr() 함수로 'C'가 처음으로 나타나는 위치의 문자열 CcDdAaBb를 반환한다.

 

10행에서 오른쪽의 97은 아스키코드 번호를 의미하며 아스키코드로 97인 문자 'a'를 의미한다. 따라서 문자열에서 'a'가 처음으로 나타나는 위치(1)를 반환한다. 이와 같이 strpos() 함수에서 찾고자 하는 문자열에 문자열이 아닌 변수형을 인자로 전달하면 해당인자를 정수형으로 취급해서 아스키코드로 자동 변환되어 해당 문자에 대한 검색을 수행한다.

 

13에서 보는 바와 같이 strpos() 함수의 세 번째 인자는 검색을 수행한 위치를 의미한다. 13행의 의미는 문자열에서 'C'를 검색하되 문자열의 5번째 문자(c)에서부터 찾으라는 의미이다. 문자열 AaBbCcDdAaBb에서 'C'의 위치 번호는 4로서 'c'보다 앞에 있으므로 해당 문자열에서는 더 이상 'C'를 찾을 수 없다. 따라서 false를 반환한다.

 

strrpos 함수

strrpos() 함수의 정의는 다음과 같다.

 

 int strrpos(string haystack, char needle);

   검색하고자 하는 문자열 haystack에서 문자 needle를 검색하여 그 위치를 반환한다.

strrpos() 함수가 검색 대상 문자열에서 찾고자 하는 문자열이 처음으로 나타나는 위치를 반환하는 것에 비해 strrpos() 함수는 찾고자 하는 문자가 마지막으로 나타나는 위치를 반환한다. 그리고 strrpos() 함수는 찾고자 하는 문자열이 아니라 단일 문자만을 검색한다. 만일 abc와 같이 찾고자 하는 인자로 문자대신 문자열을 주면 해당 문자열의 첫 번째 문자('a')를 대상으로 검색을 수행한다.

 

 

 <?

 $str1 = "AaBbCcAaBb";

 

 $res = strrpos($str1,'a');

 echo("res : $res<br>");             // res : 7

 ?>

 

[예제2.23] strrpos() 함수의 사용

 

4행의 실행결과 변수 $res에는 문자열 AaBbCcAaBb에서 문자 'a'가 마지막으로 나타나는 위치, 7이 저장된다.

 

strlen 함수

strlen() 함수의 정의는 다음과 같다.

 

 int strlen(string str);

   문자열의 길이를 반환한다.

strlen() 함수는 문자열의 길이(byte수)를 반환한다. 예로 strlen(abcd)는 4가 된다.

 

strtolower/strtoupper 함수

strtolower() 함수와 strtoupper()함수의 정의는 다음과 같다.

 

 string strtolower(string str);

   strtolower() 함수는 알파벳 대문자를 소문자로 바꾸어 반환한다.

 string strtoupper(string string);

   strtoupper() 함수는 소문자를 대문자로 바꾸어 반환한다.

 

<?

 $str = "abcd";

 

 $res = strtoupper($str);

 echo("res : $res<br>");             // res : ABCD

 

 $res = strtolower($res);

 echo("res : $res<br>");             // res : abcd

 ?>

[예제2.24] strtoupper() 와 strtolower() 함수의 사용

 

ucfirst/ucwords 함수

ucfirst() 와 ucwords() 함수의 정의는 다음과 같다.

 

 string ucfirst(string str);

   ucfirst() 함수는 알파벳 문자열의 첫 글자를 대문자로 변환한다.

 string ucwords(string str);

   ucwords() 함수는 문자열 안의 각 (알파벳)단어의 첫 글자를 대문자로 변환한다.

 

 

 <?

 $str = "abcd";

 

 $res = ucfirst($str);

 echo("$res<br>");                 // "Abcd"

 

 $str = "a blue angel";

 $res = ucwords($str);              

 echo($res);                      // "A Blue Angel"

 ?>

 

[예제2.25] ucfirst()와 ucwords() 함수의 사용

 

strrev 함수

strrev() 함수의 정의는 다음과 같다.

 

 string strrev(string string);

   문자열의 순서를 정반대로 바꾼다.

strrev() 함수는 인자로 전달한 문자열의 순서를 역전시킨다.

 

 

 <?

 $str = "abcde";

 $res = strrev($str);        // "edcba"

 echo("$res");

 ?>

 

[예제2.26] strrev() 함수의 사용

 

strtr 함수

strtr() 함수의 정의는 다음과 같다.

 

 string strtr(string str, string from, string to);

   str 문자열에 대해 문자열 from 의 각각의 문자를 새 문자열에서 같은 위치에 해당하는 문자로 각각 치환한다.

 

 

 <?

 $str = "a blue angel of Hyper world";

 $res = strtr($str,"angel", "seagull");

 echo("$res");                     // "s buug seagu of Hypgr worud"

 ?>

 

[예제2.27] strtr() 함수의 사용

 

3행의 strtr($str, "angel", "seagull") 함수는 문자열 a blue angel of Hyper world에서 각각의 문자를 다음과 같이 치환한다.

 

 문자 'a'를 's'로 치환

 문자 'n'을 'e'로 치환

 문자 'g'를 'a'로 치환

 문자 'e'를 'g'로 치환

 문자 'l'을 'u'로 치환

즉, strtr() 함수의 두 번재 인자인 angel의 각 문자를 세 번째인 seagull에서 동일한 위치에 있는 문자로 각각 치환한다. 따라서 원래의 문자열 "a blue angel of Hyper world"는 "s buug seagu of Hypgr worud"로 치환된다.

 

위 예제와 같이 치환 대상 문자열(angel)과 치환 문자열(seagull)의 크기가 일치하지 않을 경우에는 두 문자열 중 긴 문자열의 일부가 무시된다. 위에서 angel은 다섯 글자이고 seagull은 일곱 자이므로 seagull의 나머지 두 글자 ll은 함수 실행시 무시된다.

 

str_replace 함수

str_replace() 함수의 정의는 다음과 같다.

 

 string str_replace(string needle, string str, string haystack);

   대상 문자열 haystack에서 needle 문자열울 str 문자열로 바꾸어 전체 문자열을 반환한다.

strtr() 함수가 대상 문자열에 대해 호출시 지정한 두 문자열의 문자를 1:1로 치환하는데 반해 str_replace()함수는 이름 그대로 대상 문자열엣 지정한 문자열을 찾아 다른 문자열로 바꿀 때 호출한다.

 

 

 <?

$str = "a blue angel of Hyper world";

$res = str_replace("angel","seagull",$str);

echo("$res");                      // "a blue seagull of Hyper world"

 ?>

 

[예제2.28] str_replace() 함수의 사용

 

3행의 str_replace(angel,seagull,$str)는 문자열 $str에서 angel을 seagull로 바꾼다. 따라서 원래의 문자열 a blue angel of Hyper world는 a blue seagull of Hyper world로 바뀐다.

 

chop 함수

chop() 함수는 다음과 같이 정의된다.

 

 string chop(string str);

   문자열의 뒷 부분에 있는 공백 문자를 제거한 문자열을 반환한다.

chop() 함수는 문자열의 뒤에 있는 공백 문자를 잘라내고 나머지 문자열을 반환한다.

 

 

 <?

 $str = "   *** a blue angel of Hyper world ***   ";

 $res = chop($str);

 echo("[$res]");                   // "[ *** a blue angel of Hyper world ***]"

 ?>

 

[예제2.29] chop() 함수의 사용

 

문자열 $str은 앞뒤로 세 개의 공백 문자가 있다. 이 문자열을 chop() 함수에 적용시키면 $str 변수 뒷부분에 잇는 세 개의 공백 문자를 제거한 나머지 문자열을 얻는다.

 

trim 함수

trim() 함수의 정의는 다음과 같다.

 

 string trim(string str);

   문자열 앞과 뒤에 있는 공백 문자를 제거한 문자열을 반환한다.

chop() 함수가 뒷부분에 있는 공백 문자를 제거하는 것에 비해 trim() 함수는 문자열의 뒷부분뿐 아니라 앞부분에 잇는 공백 문자까지 제거하여 그 나머지 문자열을 반환한다.

 

 

 <?

 $str = "   *** a blue angel of Hyper world ***   ";

 $res = trim($str);

 echo("[$res]");                   // "[*** a blue angel of Hyper world ***}"

 ?>

 

[예제2.30] trim() 함수의 사용

 

[예제2.29]의 결과와 비교해 [예제2.30]에서 trim() 함수를 적용하면 앞뒤의 공백 문자열이 모두 제거되는 것을 알 수 있다.

 

quotemeta 함수

quotemeta() 함수의 정의는 다음과 같다.

 

 int quotemeta(string str);

   메타 문자 앞에 역슬래시(\)문자를 붙인다.

quotemeta() 함수는 다음과 같은 메타 문자 앞에 역슬래시 문자를 추가한다.

 

 

 <?

 $str = "meta character : . \\ + * ? [ ^ ] ( $ )";

 $res = quotemeta($str);

 echo("$res");                     // "meta character : \. \\ \+ \* \? \[ \^ \] \( \$ \) "

 ?>

 

[예제2.31] quotemeta() 함수의 사용

 

ord/chr 함수

ord() 와 chr() 함수의 정의는 다음과 같다.

 

 int ord(string string);

   ord() 함수는 문자열 string 의 첫 번째 문자에 대한 ASCII 코드값을 반환한다.

 string chr(int ascii);

   chr() 함수는 ASCII 코드값에 해당하는 문자를 반환한다.

ord() 함수와 chr() 함수는 서로 반대 기능을 수행하는 함수이다.

 

 

 <?

 $str = "aspell";

 $res = ord($str);

 echo("$res<br>");         // 97

 

 $res = chr($res);

 echo("$res<br>")          // 'a'

 ?>

 

[예제2.32] ord() 함수와 chr() 함수의 사용

 

4행의 ord($str)는 문자열 aspell의 첫 번째 글자인 'a'에 대한 ASCII 코드 값을 반환한다.

문자 'a'에 대한 코드 값은 97이다. 따라서 7행의 chr($res)는 ASCII 코드 값이 97인 문자 즉, 'A'를 반환한다.

 

parse_str 함수

parse_str() 함수의 정의는 다음과 같다.

 

 void parse_str(string str);

   GET 방식과 같이 URL을 통해 전달되는 query string을 파싱하여 변수와 값을 설정한다.

앞서 소개한 것처럼 PHP에서는 GET이나 POST 방식을 통해 전달되는 값에 대해서 별도의 파싱 절차가 필요 없다. 그러나 parse_str 함수를 이용하면 URL 뒤에 붙어서 전달되는 query string을 파싱하여 사용자가 전달한 변수와 값을 처리할 수 있다.

 

 

 <?

 $str = "page_num=1&key=PHP4&keyword=subject";

 parse_str($str);

 

 echo("page_num : $page_num<br>");          // "page_num : 1"

 echo("key : $key<br>");                    // "key : PHP4"

 echo("keyword : $keyword<br>");             // "keyword : subject"

 ?>

 

[예제2.33] parse_str() 함수의 사용

 

2행에서 변수 $str은 게시판과 같은 CGI 프로그램에서 URL을 통해 전달되는 query string 으로 3행에서 이 문자열을 parse_str($str) 함수로 처리하게 되면 5~7행에서와 같이 URL을 통해 넘어온 값들을 그 값으로 갖는 변수가 만들어진다.

 

[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.