PHP 텍스트에서 HTML 제거 하는 방법

2025. 6. 4. 22:31프로그램/PHP 초급

 

루젠소프트 자료실

 

PHP에서 텍스트에서 HTML 태그를 제거하는 가장 일반적이고 권장되는 함수는 바로 내장 함수인 strip_tags() 입니다.

strip_tags() 함수 사용

strip_tags() 함수는 문자열에서 HTML, XML, PHP 태그를 제거합니다. 선택적으로 제거하지 않을 태그를 지정할 수도 있습니다.

PHP
 
<?php

/**
 * 주어진 텍스트에서 모든 HTML 태그를 제거합니다.
 *
 * @param string $text HTML 태그가 포함된 원본 텍스트
 * @return string HTML 태그가 제거된 순수 텍스트
 */
function removeHtmlTags(string $text): string
{
    // 기본적으로 모든 HTML 태그를 제거합니다.
    return strip_tags($text);
}

// 사용 예시:
$htmlText1 = "<p>안녕하세요, <b>반갑습니다</b>!</p> <a href='#'>링크</a>";
$cleanText1 = removeHtmlTags($htmlText1);
echo "원본: " . $htmlText1 . PHP_EOL;
echo "제거 후: " . $cleanText1 . PHP_EOL . PHP_EOL;
// 출력:
// 원본: <p>안녕하세요, <b>반갑습니다</b>!</p> <a href='#'>링크</a>
// 제거 후: 안녕하세요, 반갑습니다! 링크

$htmlText2 = "<div><h1>제목</h1><p>내용이 <span>있습니다.</span></p></div>";
$cleanText2 = removeHtmlTags($htmlText2);
echo "원본: " . $htmlText2 . PHP_EOL;
echo "제거 후: " . $cleanText2 . PHP_EOL . PHP_EOL;
// 출력:
// 원본: <div><h1>제목</h1><p>내용이 <span>있습니다.</span></p></div>
// 제거 후: 제목내용이 있습니다.

$htmlText3 = "<script>alert('XSS');</script>안녕";
$cleanText3 = removeHtmlTags($htmlText3);
echo "원본: " . $htmlText3 . PHP_EOL;
echo "제거 후: " . $cleanText3 . PHP_EOL . PHP_EOL;
// 출력:
// 원본: <script>alert('XSS');</script>안녕
// 제거 후: 안녕

?>

특정 태그를 제외하고 제거하는 경우

strip_tags() 함수는 두 번째 인자로 제거하지 않을 태그를 지정할 수 있습니다. 예를 들어, <b>와 <i> 태그만 남기고 싶을 때 사용할 수 있습니다.

PHP
 
<?php

/**
 * 주어진 텍스트에서 지정된 태그들을 제외한 모든 HTML 태그를 제거합니다.
 *
 * @param string $text HTML 태그가 포함된 원본 텍스트
 * @param string $allowableTags 허용할 HTML 태그 목록 (예: '<b><i><a>')
 * @return string HTML 태그가 제거된 순수 텍스트
 */
function removeHtmlTagsExcept(string $text, string $allowableTags = ''): string
{
    return strip_tags($text, $allowableTags);
}

$htmlText = "안녕하세요, <b>반갑습니다</b>! <i>정말로요</i>. <p>이것은 단락입니다.</p>";

$cleanTextAll = removeHtmlTagsExcept($htmlText);
echo "모든 태그 제거: " . $cleanTextAll . PHP_EOL;
// 출력: 안녕하세요, 반갑습니다! 정말로요. 이것은 단락입니다.

$cleanTextAllowed = removeHtmlTagsExcept($htmlText, '<b><i>');
echo "<b>, <i> 태그 허용: " . $cleanTextAllowed . PHP_EOL;
// 출력: 안녕하세요, <b>반갑습니다</b>! <i>정말로요</i>. 이것은 단락입니다.

?>

strip_tags() 사용 시 고려사항

  • 문자열 잘림 문제: strip_tags()는 태그를 제거할 뿐 HTML 엔티티(예: &nbsp;, &amp;)는 변환하지 않습니다. 또한, CSS나 JavaScript를 포함하는 <style> 또는 <script> 블록 내부의 텍스트도 제거되지만, 태그 자체를 제거하기 때문에 의도치 않게 중간에 텍스트가 잘려 보이거나 연결될 수 있습니다.
  • XSS 방어의 완전성: strip_tags()는 HTML 태그를 제거하지만, 모든 종류의 XSS 공격을 100% 방어하지는 못합니다. 예를 들어, javascript: 프로토콜을 사용한 URL이나 CSS의 expression() 같은 경우에는 방어하지 못할 수 있습니다. 사용자 입력을 받을 때는 strip_tags() 외에 htmlspecialchars()를 함께 사용하거나, 더 강력한 HTML Purifier 같은 라이브러리를 사용하는 것이 안전합니다.
    • 권장 조합: htmlspecialchars(strip_tags($input))
  • HTML 유효성 검사 부족: strip_tags()는 HTML을 파싱하여 유효성을 검사하지 않습니다. 단순히 <와 > 사이의 모든 것을 태그로 간주하고 제거하므로, 잘못된 형식의 HTML도 제거될 수 있습니다.

대부분의 경우, 텍스트에서 HTML을 제거하여 순수한 텍스트만 얻고 싶을 때는 strip_tags()가 가장 간단하고 효율적인 내장 함수입니다.