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 추출
- 보안 필터링
실무에서는 대부분 여러 정규식을 조합해서 사용하게 된다.
처음에는 복잡해 보이지만 자주 쓰는 패턴만 익혀도 문자열 처리 속도가 크게 빨라진다.