반응형
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으로 저장
변수 $x도 자동 치환
\n 같은 이스케이프도 인식변수 $x도 자동 치환
작은따옴표 '...'
실제 줄바꿈도 = \n으로 저장
but
변수 $x도 글자 그대로
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)
반응형
'php' 카테고리의 다른 글
| PHP rsort — 배열 내림차순 정렬 완전 정리 (0) | 2026.06.14 |
|---|---|
| PHP sort — 배열 오름차순 정렬 완전 정리 (0) | 2026.06.14 |
| PHP implode — 배열을 구분자로 합쳐 문자열로 변환 완전 정리 (0) | 2026.06.14 |
| PHP explode — 문자열을 구분자로 잘라 배열로 변환 완전 정리 (0) | 2026.06.14 |
| PHP addslashes — 따옴표 이스케이프 완전 정리 (0) | 2026.06.14 |
왕진 블로그

댓글