정의 및 사용 방법
- PHP 버전
- 4+
strip_tags()
함수는 문자열에서 HTML 및 PHP 태그를 제거한 문자열을 반환합니다.
이 함수는 HTML 태그로 인한 서식을 제거해 태그가 없는 순수 텍스트(예: 게시물 요약, 검색 결과, 알림 메시지)를 얻을 때 주로 사용합니다.
보안 목적에는 적합하지 않습니다.
기본 예제
$raw = '<p class="welcome">환영합니다. <b>PHP</b>에 오신 것을 환영합니다.</p> <a href="#">링크</a>입니다.';
// 문자열에서 HTML 태그를 모두 제거하고 순수 텍스트만 반환
echo strip_tags($raw); // 출력: '환영합니다. PHP에 오신 것을 환영합니다. 링크입니다.'
구문
strip_tags(string $string, array|string|null $allowed_tags = null): string
- 문자열에서 HTML 태그, XML 태그, PHP 태그를 모두 제거합니다.
- HTML과 XML 태그와 태그 사이의 텍스트는 제거하지 않지만, 주석(
<!-- -->
)과 주석의 내용은 제거합니다. - 문자열에 있는 PHP 태그(
<?php
와?>
)와 태그 안에 있는 내용도 모두 함께 제거합니다. - 필요할 경우 두 번째 매개 변수(
$allowed_tags
)를 사용해 HTML이나 XML의 제거해서는 안 되는 태그를 지정할 수 있습니다.
매개변수
$string |
필수. 태그를 제거할 대상 문자열입니다. |
---|---|
$allowed_tags |
옵션. 제거해서는 안 되는 태그를 지정할 수 있습니다. 이 태그는 문자열로 제공되거나 PHP 7.4.0 버전에서 배열로 제공됩니다. 아래 부연설명을 참고하세요. |
$allowed_tags
에 대한 부연설명
이 매개변수는 선택 사항이며, 제거하지 않고 남겨둘 태그를 지정합니다. 문자열 또는 배열로 지정할 수 있습니다.
알아두세요!
HTML과 XML의 주석(<!-- -->
), PHP의 태그는 $allowed_tags
로 변경할 수 없습니다. 즉, 무조건 제거됩니다.
문자열로 지정하기 (모든 PHP 버전)
가장 일반적인 방법으로, 유지할 태그들을 <
와 >
를 포함하여 공백 없이 하나의 문자열로 나열합니다.
$raw = '<p class="welcome">환영합니다. <b>PHP</b>에 오신 것을 환영합니다.</p> <a href="#">링크</a>입니다.';
// 문자열에서 <b> 태그를 제외한 모든 태그를 모두 제거하고 순수 텍스트만 반환
echo strip_tags($raw, '<b>'); // 출력: '환영합니다. PHP에 오신 것을 환영합니다. 링크입니다.'
// 문자열에서 <b>와 <a> 태그를 제외한 모든 태그를 모두 제거하고 순수 텍스트만 반환
echo strip_tags($raw, '<b><a>'); // 출력: '환영합니다. <b>PHP</b>에 오신 것을 환영합니다. <a href="#">링크</a>입니다.'
배열로 지정하기 (PHP 7.4.0 이상)
PHP 7.4.0 버전부터는 $allowed_tags
를 배열로 지정할 수 있습니다. 각 태그 이름만 문자열로 배열에 넣어주면 됩니다. 이 방식은 코드를 더 깔끔하게 작성할 수 있게 해줍니다.
$raw = '<p class="welcome">환영합니다. <b>PHP</b>에 오신 것을 환영합니다.</p> <a href="#">링크</a>입니다.';
// 문자열에서 <b> 태그를 제외한 모든 태그를 모두 제거하고 순수 텍스트만 반환
echo strip_tags($raw, ['b']); // 출력: '환영합니다. PHP에 오신 것을 환영합니다. 링크입니다.'
// 문자열에서 <b>와 <a> 태그를 제외한 모든 태그를 모두 제거하고 순수 텍스트만 반환
echo strip_tags($raw, ['b', 'a']); // 출력: '환영합니다. <b>PHP</b>에 오신 것을 환영합니다. <a href="#">링크</a>입니다.'
참고 사항
- HTML과 XML의 주석(
<!-- -->
)과 PHP의 태그는 항상 제거됩니다. 이 동작은 하드코딩되어 있어서$allowed_tags
로 변경할 수 없습니다. <br/>
과 같은 자체 닫힘(Self-closing) XHTML 태그는$allowed_tags
에서 무시됩니다. 자체 닫힘 태그가 아닌 태그만 사용해야 합니다. 예를 들어,<br>
과<br/>
둘 다 제대로 지정하려면 반드시<br>
만 지정해야 합니다.
반환 값
제거된 문자열을 반환합니다.
변경 이력
PHP 8.0.0부터 | $allowed_tags 는 이제 null 값을 가길 수 있습니다. |
---|---|
PHP 7.4.0부터 | $allowed_tags 를 배열로 지정할 수 있습니다. |
주의할 점
보안에 대한 오해
이 함수는 XSS(Cross-Site Scripting) 공격을 방지하는 데 사용해서는 안 됩니다. XSS 공격을 완전히 막아주지 못합니다. 따라서 보안 목적으로 사용할 때는 출력 상황에 따라htmlspecialchars()
와 같은 더 적절한 함수나 다른 방법을 사용하세요.
불완전한 태그 처리
strip_tags()
함수는 HTML 유효성 검사기가 아닙니다. 실제로 HTML을 검증하지 않기 때문에 일부 또는 깨진 태그로 인해 예상보다 많은 텍스트/데이터가 제거될 수 있습니다.
허용된 태그의 속성을 수정하지 않습니다.
$allowed_tags
매개변수로 특정 태그를 허용하더라도, 그 태그의 속성까지는 검사하지 않습니다. 예를 들어, <a href="...">
를 허용하면 href 속성 안에 있는 javascript:alert(...)
같은 악성 코드도 그대로 남게 됩니다.
활용 예제
strip_tags()
함수를 활용하는 실용적인 예제들입니다.
게시물 요약
게시판이나 블로그 목록에서 긴 본문을 요약하여 보여줄 때, 모든 HTML 태그를 제거하고 순수 텍스트만 추출하는 데 유용합니다.
$post_content = '
<h1>PHP strip_tags() 함수</h1>
<p>이 함수는 문자열에서 <b>HTML 및 PHP 태그</b>를 제거합니다.</p>
<img src="image.jpg" alt="예시 이미지">
<p>이것은 매우 중요한 내용입니다. <a href="https://example.com">더보기</a></p>';
// 모든 태그를 제거하여 순수 텍스트만 추출
$plain_text = strip_tags($post_content);
// 추출된 텍스트를 100자 이내로 자르기
$summary = mb_strimwidth($plain_text, 0, 100, '...', 'UTF-8');
echo "<h2>게시물 요약</h2>";
echo "<p>{$summary}</p>";
코드 부연설명
mb_strimwidth()
함수는 지정된 너비의 잘린 문자열 가져옵니다. 이 함수는 문자열의 길이를 바이트가 아닌 문자로 계산하기 때문에, 한글이나 일본어, 중국어와 같은 멀티바이트 문자가 깨지지 않고 올바르게 처리된다는 장점이 있습니다.
허용된 태그만 유지하기
$user_input = '
<h1>주요 내용</h1>
<p>이 문장은 <b>중요합니다.</b></p>
<a href="https://example.com">링크</a>입니다.';
// <b>와 <p> 태그만 허용
$allowed_tags = '<b><p>';
$result = strip_tags($user_input, $allowed_tags);
echo $result;