2013. 10. 17.

PHP 문자열 찾기 함수. strpos() 그리고 eregi().

어느샌가 점점 돌대가리가 되어 가는것 같다.
자주 사용 하는 함수 인데, 매번 생각이 안나서 검색을 해야 한다. 여기에 정리 하다 보면 기억에 남으리라 믿는다. 일단, PHP에서 문자열에서 특정 문자가 포함 되었는지 찾아 주는 함수다.
int eregi ( string $pattern , string $string [, array &$regs ] );
예를 들어보자.
echo eregi( 'A', "ABCDEFG");
간단 하다. 파라미터 2개 중에 앞에 찾을려는 문자, 뒤에는 문자열이다. 세번째 파라미터는 패턴 뭐 어쩌고... 모르겠다. 궁금한 사람은 http://php.net/manual/en/function.eregi.php 여기서 보면 된다.

반환값은 몇 번째에 있는가 그런거 상관 없이 있으면 1, 없으면 0을 반환 한다. 세번째 파라미터가 들어가면 반환값이 바뀌는것 같다만 거기까진 알지 말자. PHP닷넷에서 보다보니, 이 함수는 PHP 5.3.0. 버전 이후로는 사용하지 말란다.

mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] );
위에 녀석과 파라미터가 반대다. 앞에 문자열이 들어가고 뒤에 찾을 문자가 들어간다. eregi()와 다른점은 이녀석은 찾고자 하는 문자의 위치를 반환 해준다.
예를 들어보자.
echo strpos( "ABCDEFG" , "A" );
이러면 0이 나온다. 첫번째니까. "B"를 찾으면 1이 나오고, G를 찾으면 6이 나오겠지.
그럼 이러면 어떨까?
echo strpos( "ABCDEFG" , "H" );
찾고자 하는 문자가 문자열에 없다. 그럼 이녀석은 int 숫자값이 아닌 boolean 값을 뱉는다. 
찾았을때는 위치 숫자값을, 못찾으면 boolean(false)를 뱉는다. http://php.net/manual/en/function.strpos.php 
참고해보면 이 함수를 사용해서 조건문을 돌릴때면 비교 연산자를 === 또는 !==를 쓰란다.

'=' 이게 3개가 붙어있는거 솔직히 처음 봤다.
 $a === $b  $a와 $b가 같고, 같은 자료형이면 TRUE. (PHP 4에서 추가)
 $a !== $b  $a가 $b와 같지 않거나, 같은 자료형이 아니면 TRUE. (PHP 4에서 추가) http://php.net/manual/kr/language.operators.comparison.php 읽었는데 무슨 말인지 모르겠다.
이해 안되는게 분해서 저 권장사항이 쓸모없음을 증명하고 싶었다.
if( strpos( "ABCDEFG" , "H" ) >=0 )
   echo "포함되네";
어짜피 찾으면 0부터 시작되는 숫자값 줄꺼고, 못찾으면 false니까 뭐 이러면 되겠네!
라고 생각했는데 멍청한 생각이다.
if( -1    ) echo "헐퀴-1";
if(  0    ) echo "헐퀴0";
if(  1    ) echo "헐퀴1";
if( true  ) echo "헐퀴true";
if( false ) echo "헐퀴false";
틈이 나면 이렇게 한번 찍어보라. 0과 false는 헐퀴를 볼 수 없다. 0을 false처럼 써지니까.
while(1) 이런거 많이 해봤잖아.

strpos()는 찾지 못하면 false 을 뱉는다. 찾고자 하는게 가장 첫번째에 있어도 0을 뱉는다.
위의 예제를 보면 결국  false >= 0 이 되는거고 참이다. 항상 참이다.
false는 boolean형이고 0은 int형이지만, if는 신경 안쓴다. 그래서 !== 이나 ===을 쓴다.

권장사항은 이렇다.
if( strpos( "ABCDEFG" , "H" ) !== false )
    echo "헤헿 포함!";
이러면 false !== false 가 되고, 자료형도 달라야되고, 값도 달라야되는데 둘다 같아서 거짓!.
찾을경우 0~n !== false 가 되고, 자로형도 다르고 값도 다르므로 이 되는 것. 

어? 쓰고있는데 햇갈린다.

댓글 없음 :

댓글 쓰기