PHP 정규식으로 줄바꿈, HTML 태그, 특수문자 제거하는 방법 정리

PHP 정규식은 문자열 가공 작업에서 가장 많이 사용하는 기능 중 하나다.
특히 게시판, 쇼핑몰, 크롤링 데이터, 스마트에디터 HTML 정리 작업에서는 개행문자 제거, HTML 태그 삭제, script 차단, 특수문자 제거 같은 작업이 반복적으로 등장한다.

이 글에서는 PHP preg_replace()와 문자열 함수를 이용해 자주 사용하는 문자열 정리 정규식을 실제 예제 중심으로 정리한다.
실무에서 바로 복사해서 사용할 수 있도록 상황별 예제를 함께 설명한다.

줄바꿈(CRLF) 제거는 왜 필요한가

웹 프로그램에서 textarea 내용을 저장하거나 API 데이터를 가공할 때 줄바꿈 문자 때문에 문제가 생기는 경우가 많다.

대표적으로 이런 상황이 있다.

  • JSON 저장 시 개행 문제 발생
  • CSV 저장 시 줄 밀림
  • SMS 발송 시 문자 깨짐
  • HTML 압축 시 공백 증가
  • 검색 비교 시 문자열 불일치

실제로 게시판 데이터를 Excel로 내보내는 작업을 할 때 개행문자가 포함되어 셀이 밀리는 문제를 자주 겪었다.
이럴 때 가장 먼저 사용하는 것이 개행 제거 정규식이다.

줄 바꿈 제거 방법

정규식 사용

$text = preg_replace('/\r\n|\r|\n/', '', $text);

Windows(CRLF), Linux(LF), Mac(CR) 개행문자를 모두 제거한다.

문자열 함수 사용

$text = str_replace(array("\r\n", "\r", "\n"), '', $text);

$text = strtr($text, array(
	"\r\n" => '',
	"\r" => '',
	"\n" => ''
));

문자열 함수가 정규식보다 속도가 빠른 경우도 많다.

HTML 태그 제거는 왜 중요한가

사용자 입력값에 HTML 태그가 포함되면 다음 문제가 발생할 수 있다.

  • XSS 공격
  • 레이아웃 깨짐
  • 관리자 페이지 오염
  • 검색 결과 오류
  • 메일 발송 문제

특히 스마트에디터 내용을 TEXT 형태로 저장할 때 많이 사용한다.

HTML 태그 제거

$content = preg_replace("(\<(/?[^>]+)>)", "", $content);

textarea 태그만 치환한다.

script 태그 제거

$str = preg_replace("!<script(.*?)</script>!is", "", $str);

보안상 매우 중요한 처리다.

특히 사용자 입력 HTML 저장 시 거의 필수로 사용된다.

iframe 제거

$str = preg_replace("!<iframe(.*?)</iframe>!is", "", $str);

외부 사이트 삽입 차단 시 사용한다.

meta 태그 제거

$str = preg_replace("!<meta(.*?)>!is", "", $str);

크롤링 데이터 정리 시 자주 사용한다.

style 태그 제거

$str = preg_replace("!<style(.*?)</style>!is", "", $str);

불필요한 CSS 제거용이다.

공백 및 특수문자 제거

문자열 비교나 검색 기능 구현 시 공백 정리가 중요하다.

연속 공백 제거

$str = preg_replace("/\s{2,}/", " ", $str);

공백 여러 개를 하나로 변경한다.

공백 제거

$string = preg_replace('/ /', '', $string);

$string = preg_replace("/\s+/", "", $string);

탭, 줄바꿈 포함 전체 공백 제거 시 두 번째 방법을 사용한다.

특수문자 제거

$string = preg_replace(
	"/[ #\&\+\-%@=\/\\\:;,\.'\"\^`~\_|\!\?\*$#<>()\[\]\{\}]/i",
	"",
	$string
);

검색 키워드 정리 시 많이 사용한다.

태그 속성 제거 방법

크롤링 HTML이나 스마트에디터 HTML 정리 시 style, width, height 제거 작업이 자주 필요하다.
실제로 오래된 게시판 데이터를 리뉴얼 사이트로 이전할 때 inline style 제거 작업을 많이 했다.

style 속성 제거

// style=border:0
$str = preg_replace("/ style=([^\"']+) /", " ", $str);

// style="border:0"
$str = preg_replace("/ style=(\"|')?([^\"']+)(\"|')?/", "", $str);

width, height 제거

$str = preg_replace("/ width=(\"|')?\d+(\"|')?/", "", $str);

$str = preg_replace("/ height=(\"|')?\d+(\"|')?/", "", $str);

img 태그 src 추출

이미지 주소만 가져와야 할 때 사용하는 정규식이다.

img src 하나 추출

preg_match(
	"/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i",
	$str,
	$result
);

img src 전체 추출

preg_match_all(
	"/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i",
	$str,
	$result
);

게시글 이미지 수집 기능에서 많이 사용한다.

영문자만 남기기

영문자만 유지

$string = preg_replace("/[^A-Za-z]/", "", $string);

영문 + 공백만 유지

$string = preg_replace("/[^A-Za-z|\x20]/", "", $string);

ASCII 문자만 유지

$string = preg_replace("/[^\x20-\x7e]/", "", $string);

한글 제거, 특수문자 제거 등에 활용 가능하다.

정규식 사용 시 주의사항

정규식은 매우 강력하지만 잘못 사용하면 성능 문제가 발생할 수 있다.

특히 대용량 HTML 처리에서는 아래를 주의해야 한다.

  • .* 과도 사용 금지
  • HTML 전체를 정규식만으로 파싱하지 않기
  • UTF-8 환경 고려
  • 사용자 입력값 검증 필수
  • XSS 필터 별도 적용 권장

HTML 구조 분석이 목적이라면 PHP의 DOMDocument 사용이 더 안전한 경우도 많다.

정리

PHP 정규식은 문자열 정리 작업에서 거의 필수 기능이다.

특히 아래 작업에서 매우 자주 사용된다.

  • 게시판 HTML 정리
  • 스마트에디터 데이터 가공
  • 크롤링 데이터 정리
  • 검색어 전처리
  • 특수문자 제거
  • 이미지 src 추출
  • 보안 필터링

실무에서는 대부분 여러 정규식을 조합해서 사용하게 된다.
처음에는 복잡해 보이지만 자주 쓰는 패턴만 익혀도 문자열 처리 속도가 크게 빨라진다.