본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP nl2br — 줄바꿈을 <br>태그로 완전 정리

by 왕진 2026. 6. 14.
반응형

 

 

Web Development · PHP nl2br

PHP nl2br —
줄바꿈 문자를 <br> 태그로 변환

"엔터"를 HTML이 알아들을 수 있는 줄바꿈으로 바꿔주는 함수
시작 오늘 분석할 코드

여러 줄로 작성된 문자열을 그대로 HTML에 출력하면 한 줄로 다 붙어서 보인다. 그 이유는 HTML이 줄바꿈 문자(\n)를 화면 줄바꿈으로 인식하지 않기 때문. nl2br\n<br>로 자동 변환해 이 문제를 해결한다.

<?php $string = "PHP의 함수는 정말 편리 합니다."; $result = nl2br($string); // 엔터(\n)가 들어 있는 자리에 <br>을 자동 삽입 print $result; ?>
실제 출력 결과 (브라우저에서)
PHP의 함수는
정말 편리
합니다.
엄밀히는 nl2br은 \n<br />\n으로 바꾼다 — 줄바꿈 문자를 유지하면서 그 앞에 <br>을 추가한다.
용어 용어 정리
nl2br()"new line to br" — 줄바꿈을 <br>로 변환
\n줄바꿈(LF) 제어 문자, 보이지는 않음
\r\n윈도우식 줄바꿈 (CR + LF)
<br>HTML의 줄바꿈 태그
화이트스페이스 처리HTML이 공백·줄바꿈을 합쳐 표시하는 규칙
큰따옴표 문자열\n 같은 이스케이프 시퀀스 인식
작은따옴표\n을 글자 그대로 (이스케이프 안 함)
<pre>, white-space:pre\n을 그대로 줄바꿈으로 보여주는 다른 방법

1 왜 줄바꿈이 안 보이는가? — HTML 화이트스페이스 규칙

HTML은 소스 코드의 여러 공백·탭·줄바꿈을 모두 한 칸의 공백으로 간주한다. 이게 디자인 의도였다 — 작성자가 어떻게 들여쓰기를 했든 화면 출력은 일정해야 하니까.

// 사용자가 텍스트 영역에 입력 "안녕하세요 저는 김철수입니다" // HTML 출력 결과 (그대로 출력) "안녕하세요 저는 김철수입니다" ← 한 줄로 합쳐짐
사용자가 게시판·메모·댓글에 줄바꿈을 넣어 작성했는데 화면에선 다 한 줄로 나오는 답답한 상황 — nl2br이 등장하는 자리.

2 nl2br의 동작
nl2br("a\nb\nc") ↓ "a<br />\nb<br />\nc" ↓ 브라우저 a b c

입력에 들어 있는 모든 줄바꿈 위치 앞에 <br>을 삽입한다. 이때 줄바꿈 문자 자체는 지우지 않고 유지한다 (소스 보기 시 가독성 유지).

입력 안의 줄바꿈 처리
\n (Unix/Mac) <br />\n
\r\n (Windows) <br />\r\n
\r (옛 Mac) <br />\r

3 큰따옴표 안에 적은 줄바꿈

이 코드의 $string여러 줄에 걸쳐 작성됐다. PHP의 큰따옴표 문자열은 줄바꿈을 그대로 안에 담는다.

$string = "PHP의 함수는 정말 편리 합니다."; // 메모리 안에는 ↓ "PHP의 함수는\n정말 편리\n합니다."
큰따옴표 "..."
실제 줄바꿈 = \n으로 저장
\n 같은 이스케이프도 인식
변수 $x도 자동 치환
작은따옴표 '...'
실제 줄바꿈도 = \n으로 저장
but \n은 글자 그대로
변수 $x도 글자 그대로
※ 헷갈리지 말 것: 실제 엔터로 줄을 바꾼 것은 큰/작은 따옴표 모두 \n으로 저장된다. 차이는 \n이라는 글자 시퀀스를 어떻게 해석하느냐다.

 

반응형

 

4 단계별 추적
1
$string에 3줄 문자열 저장메모리: "PHP의 함수는\n정말 편리\n합니다."
2
nl2br($string) 호출함수가 \n 위치 2곳을 찾음
3
각 \n 앞에 <br /> 삽입"PHP의 함수는<br />\n정말 편리<br />\n합니다."
4
$result에 저장변환된 문자열을 받음
5
print $resultHTML로 전송
6
브라우저 렌더링<br> 태그가 진짜 줄바꿈으로 표시됨

5 nl2br 외 대안

줄바꿈을 살리는 방법은 여러 가지다. 상황에 따라 선택.

방법 장점 단점
nl2br($s) 간단, PHP 한 함수로 끝 HTML 의존, <br> 태그 흔적
<pre>$s</pre> 모든 공백·줄바꿈 보존 모노스페이스 글꼴 강제
CSS white-space: pre-wrap 현대적, 글꼴 자유 CSS가 반드시 적용돼야
str_replace("\n", "<br>", $s) 옛 PHP에서 가능 플랫폼별 줄바꿈 처리 X
※ 현대 권장: CSS
  • HTML: <div class="memo">사용자 텍스트</div>
  • CSS: .memo { white-space: pre-wrap; }
  • 장점: 글자엔 손대지 않고 화면 표시만 처리
  • 저장된 데이터에 <br> 같은 흔적이 남지 않음

6 XSS 방어와 함께

사용자 입력을 그대로 nl2br으로 출력하면 HTML 태그도 그대로 들어가 XSS 공격이 가능하다. 보통 htmlspecialchars로 이스케이프 후 nl2br을 적용한다.

// 위험 (XSS 가능) print nl2br($_POST['comment']); // 안전 (HTML 이스케이프 + 줄바꿈 변환) print nl2br(htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8'));
※ 순서 주의: htmlspecialchars 먼저, 그 다음 nl2br. 반대로 하면 nl2br이 만든 <br />도 이스케이프돼 화면에 글자로 보인다.

7 자주 하는 실수
실수 증상 해결
작은따옴표 안에 \n 적음 변환 안 됨 (\n이 글자 그대로) 큰따옴표 사용
nl2br 결과를 다시 변환 의도와 다른 결과 한 번만 적용
HTML 이스케이프 후 변환 OK (권장 순서) 맞음
nl2br 후 HTML 이스케이프 <br />도 이스케이프됨 순서 바꾸기 (특수문자 → 줄바꿈)
DB에 nl2br 결과 저장 데이터에 <br> 흔적 남음 저장은 원본, 출력 시 변환

8 매개변수 옵션 — XHTML 호환
nl2br($string); // 기본 — <br /> (XHTML 호환) nl2br($string, false); // <br> (HTML5 단독)
PHP 5.3부터 두 번째 매개변수가 추가됐다. 현대 HTML5에서는 <br>이 표준이지만 <br />도 모두 호환된다. 기본값(true)으로 그냥 써도 무방.

9 응용 — 게시판 형태로 출력
// 게시판에 글 출력 (안전 + 줄바꿈 살리기) function safe_display($text) { $escaped = htmlspecialchars($text, ENT_QUOTES, 'UTF-8'); return nl2br($escaped); } print safe_display($post['content']);

핵심 한 줄 요약

nl2br()줄바꿈 문자(\n) 앞에 <br />을 자동 삽입
목적HTML이 무시하는 줄바꿈을 화면에 보이게 함
큰따옴표 필수실제 엔터를 안에 담거나 \n 인식
XSS 주의먼저 htmlspecialchars로 이스케이프, 그 후 nl2br
현대 대안CSS white-space: pre-wrap (구조와 표시 분리)
DB 저장원본 그대로 저장, 출력 시점에만 변환
옵션두 번째 매개변수 false → <br> (HTML5)
반응형

댓글