본문 바로가기

프로그래밍 공부/PHP

PHP - 문자열 조작

입력 데이터 처리

문자열 바이트 수 얻기

문자열의 바이트 수 얻기는 데이터 베이스에 데이터를 저장할 때 데이터의 바이트 수를 검사해야 할 경우가 있다. 이때 문자열의 바이트 수를 얻으려면 strlen 함수를 사용한다.

1
2
3
4
5
6
7
8
9
<?php
    // 문자열의 바이트 수 얻기
    $str = "안녕하세요.";
    $length = strlen($str);
    $mb_length = mb_strlen($str);
 
    print $langth;
    print $mb_length;
?>
cs

strlen 함수를 사용하면 문자열의 길이를 변수로 돌려받을 수 있다. 예를 들면 회원가입을 할 때 사용자가 사용할 아이디 또는 비밀번호가 특정 문자열 길이를 만족해야 할 때 활용할 수 있는 기능이다.

문자열 자르기

문자열 자르기는 HTML 폼에서 송신된 데이터(문자열)에서 필요한 부분만 가져오려면 substr 함수를 사용한다. 대상 문자열과 시작 위치, 시작 위치부터 가져올 문자열까지의 길이를 지정해 결과를 변수에 할당할 수 있다.

1
2
3
4
5
<?php
    // 문자열 자르기
    $string = "ABCDEFGHIJKLMN";
    $result = substr($string,3,5);
?>
cs

위의 코드에서 substr($string,3,5);는 위의 $string = "ABCDEFGHIJKLMN"; 이기 때문에 3번째는 D에 해당하고, D부터 5개의 문자 즉 DEFGH가 $result;에 할당이 된다고 보면 된다.

문자열 바꾸기

문자열 바꾸기는 문자열에 포함된 문자를 바꿀때 사용한다. str_replace 함수를 사용한다. 순서대로 찾을 문자, 바꿀 문자, 문자열 순으로 인수를 지정하면 결과를 변수로 받을 수 있다.

1
2
3
4
5
6
7
<?php
    // 문자열 바꾸기
    $html = '<font size="3">HELLO!</font><br>';
    $search = 'size="3"';
    $replace = 'size="5"';
    $result = str_replace($search,$replace,$html);
?>
cs

주의해야 할 점은 위의 ''(작은 따옴표)와 ""(큰 따옴표)를 구별해야 한다는 것이다. 겉을 ''(작은 따옴표)로 묶으면 내부는 ""(큰 따옴표)를 사용해 PHP가 인식 오류가 나지 않도록 해주어야 한다. 만약 같은 종류의 따옴표를 사용하려면 \'(역슬래시 + 따옴표)와 같은 이스케이프 문자를 사용해 주어야 한다.

공백 제거하기

HTML 폼에서 송신된 데이터(문자열)의 앞뒤에 공백이 있으면 데이터를 검사할 때 오류가 발생할 수 있다. 이때 trim 함수를 사용하면 데이터 앞뒤로 공백 문자라는 불필요한 문자들만 한번에 제거 할 수 있다.

1
2
3
4
5
<?php
    // 공백 제거하기
    $string = "  1234567890";
    $result = trim($string);
?>
cs

JavaScript의 trim 함수와도 같은 기능을 수행하기 때문에 어려움이 없다. 

여기서 공백 문자(White space)는 스페이스 뿐만 아니라 탭(tab), 라인피드(linefeed), 캐리지 리턴(carriage return), NULL 문자(NULL byte) 그리고 수직탭(vertical tab)을 포함한다.

문자 의미
[ ] 스페이스
\t
\n 라인피드
\r 캐리지 리턴
\0 NULL 문자
\x0B 수직 탭

HTML의 표시

HTML 태그 무효로 처리하기

웹 브라우저에 표시되는 데이터를 가공하는 함수를 다룬다. HTML 태그를 HTML 엔터티로 변환하는 htmlspecialchars 함수가 있다. 이 함수는 HTML 태그에 사용하는 특수문자로 변환하여(표, 변환 가능 문자 참조) HTML 태그로 동작하지 않는 문자로 표시할 수 있다. JavaScript에 포함된 입력 데이터는 송신될 때 일반 문자열로 받을 수 있어 HTML 태그를 특수문자로 변환하는 것만으로도 개인 정보를 훔치는 크로스사이트 스크립팅(악의적인 사용자에 의한 공격의 일종)에 노출되는 것을 방지할 수 있다.

1
2
3
4
5
6
<?php
    // HTML 태그 무효로 처리하기
    $string = '<a href="http://www.naver.com">네이버</a>';
    $result = htmlspecialchars($string,ENT_QUOTES);
    print $result;
?>
cs

위의 코드의 HTML 소스를 확인하면 내부에 사용한 태그가 특수문자로 변환된 것을 알 수 있다.

변환 가능한 문자는 아래와 같다.

표현문자 특수문자
&(앰퍼샌드) &amp;
"(큰 따옴표) &quot;
'(작은 따옴표) &#39;
<(보다 작은) &lt;
>(보다 큰) &gt;

작은 따옴표, 큰 따옴표의 변환은 아래와 같다.

옵션 의미
ENT_COMPAT ["]만 변환(기본 옵션)
ENT_QUOTES ["]['] 모두 변환
ENT_NOQUOTES 아무것도 변환하지 않음

HTML 태그 제거하기

문자열에서 HTML 태그를 제거하려면 strip_tags 함수를 사용한다.

1
2
3
4
5
6
<?php
    // HTML 태그 제거하기
    $string = '<a href="http://www.naver.com">네이버</a><hr><br>';
    $result = strip_tags($string);
    print $result;
?>
cs

다만 이 함수는 HTML 태그는 제거하지 않기 때문에 크로스사이트 스크립팅에 대응하기 위해서는 htmlspecialchars 함수를 사용하는 쪽이 좋다.

개행 코드 앞에 HTML 줄바꿈 태그 붙이기

nl2br 함수를 사용하면 문자열에 포함된 모든 줄바꿈(개행) 코드의 앞에 <br>태그를 추가한다.

1
2
3
4
5
6
7
8
<?php
    // 개행 코드 앞에 HTML 줄바꿈 태그 붙이기
    $string = "PHP는
    JavaScript보다
    구리다.";
    $result = nl2br($string);
    print $reault;
?>
cs

게시판의 콘텐츠와 같이 본문에 줄바꿈을 포함한 데이터를 받아 웹 브라우저에 그대로 표시하면 개행 코드는 줄바꿈 되지 않고 문장이 한 행으로 표시된다. 이런 데이터에 nl2br 함수를 적용하면 HTML 줄바꿈 태그가 개행 코드의 앞에 추가 되기 때문에 입력한 그대로 줄바꿈되어 표시할 수 있다.

배열을 사용한 문자열 처리

배열에서 문자열 작성하기

implode 함수를 사용하면 배열의 데이터를 지정한 문자로 구분한 문자열을 만들 수 있다.

1
2
3
4
5
<?php
    // 배열에서 문자열 작성하기
    $data = array("사과""귤""감""밤");
    $result = implode(',',$data);
?>
cs

array 함수로 만든 $data를 implode 함수를 이용해 ,를 기준으로 항목을 구분하는 것과 같은 경우에 사용하게 된다. implode와 같은 것으로 join 함수가 있다.

데이터베이스에 넘기는 문자열 가공

오류가 되는 문자를 이스케이프하기

웹 애플리케이션에서는 HTML 폼에서 전송받은 데이터로 데이터베이스를 검색할 때가 있다. 이 데이터 안에 데이터베이스에 사용하는 SQL에서 특별한 의미를 가지는 문자가 포함되어 있으면 오류가 발생한다.

이 경우에 addslashes 함수를 써서 인수로 지정한 문자열안의 데이터베이스 질의에서 오류를 일으키는 문자 앞에 \를 추가하여 SQL로 동작하지 않게 한다.

1
2
3
4
5
6
<?php
    // 오류가 되는 문자를 이스케이프하기
    $string = '"사과","귤","감","밤"';
    $result = addslashes($string);
    print $result;
?>
cs

결과는 변수로 받을 수 있다.

문자열에서 배열 작성하기

explode 함수는 문자열을 구분 문자로 나눈 결과를 배열에 넣을 수 있다.

1
2
3
4
5
6
7
8
<?php
    // 문자열에서 배열 작성하기
    $string = "사과, 귤, 감, 밤";
    $array = explode(',',$string);
    print "<pre>";
    print_r($array);
    print "</pre>";
?>
cs

위의 코드는 ,를 기준으로 배열을 작성한 경우이다.

문자열 조작 함수 정리

함수 이름 함수 형태 함수 설명
strlen $변수 = strlen($문자열); 바이트 수 얻기
substr $변수 = substr(문자열, 시작 위치, 문자열의 길이); 문자열 자르기
str_replace $변수 = str_replace(찾을 문자, 바꿀 문자, 문자열); 문자열 바꾸기
trim $변수 = trim(문자열); 공백 제거
htmlspecialchars $변수 = htmlspecialchars(문자열, 옵션); HTML 태그 무효 처리
strip_tags $변수 = strip_tags(문자열, 허용할 태그); HTML 태그 제거
nl2br $변수 = nl2br(문자열); 개행 태그 추가
implode $변수 = implode(구문 문자, 배열); 배열에 문자열 작성
addslashes $변수 = addslashes(문자열); 오류 문자 이스케이프
explode $변수 = explode(구문 문자, 문자열); 문자열에 배열 작성