본문 바로가기

비개발자의 개발 일지

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

시리즈 보기
php

PHP TEXTAREA + nl2br() — 장문 입력 완전 정리

by 왕진 2026. 7. 11.
반응형

 

 

Web Development · PHP

PHP TEXTAREA + nl2br() —
장문 입력 완전 정리

여러 줄 텍스트를 받는 TEXTAREA와, 엔터를 <br>로 변환하는 nl2br() 함수
시작 오늘 분석할 코드

이름 + 본문(여러 줄)을 입력받아 전송하는 폼이다. TEXTAREA로 장문을 입력받고, PHP에서 nl2br()로 줄바꿈을 처리해 출력한다.

form.html — 입력 화면
<FORM name="form1" method="post" action="view.php"> 이름:<BR> <INPUT type="text" name="onamae"><BR> 본문:<BR> <TEXTAREA name="honbun" cols="30" rows="5"></TEXTAREA><BR> <INPUT type="submit" value="송신"> </FORM>
view.php — 결과 화면
<?php print $_POST["onamae"]." 님으로부터의 메시지"; print "<BR><BR>"; print "본문 :<BR>"; print nl2br($_POST["honbun"]); // 엔터를 <br>로 변환 후 출력 ?>
실제 출력 미리보기

홍길동 님으로부터의 메시지

본문 :
안녕하세요.
오늘 날씨가 좋네요.
반갑습니다.

용어 용어 정리
<TEXTAREA>여러 줄 텍스트를 입력받는 HTML 요소
colsTEXTAREA 가로 너비 — 글자 수 단위
rowsTEXTAREA 세로 높이 — 줄 수 단위
nl2br()newline to BR — PHP 함수, 줄바꿈(\n)을 <br>로 변환
\n (개행문자)엔터 키를 눌렀을 때 생기는 줄바꿈 문자
honbun일본어로 "본문" — TEXTAREA의 name 속성 값
placeholder입력 전 힌트 텍스트 — HTML5에서 추가된 속성
maxlength입력 가능한 최대 글자 수 제한 속성

1 TEXTAREA — 장문 입력 요소
INPUT type="text"와 무엇이 다른가?

한 줄짜리 텍스트는 <INPUT type="text">를 쓰지만, 여러 줄의 장문은 <TEXTAREA>를 써야 한다.

INPUT type="text"
한 줄만 입력 가능
self-closing 태그 <INPUT>
기본값: value 속성
이름, 전화번호, 이메일 등 단답형
TEXTAREA
여러 줄 자유롭게 입력
여는/닫는 태그 쌍 필수
기본값: 태그 사이에 직접 입력
메시지, 게시글, 소개글 등 장문
※ TEXTAREA는 자기닫기 태그가 아니다. </TEXTAREA>를 반드시 써야 한다. 그 안에 미리 텍스트를 넣으면 기본값으로 표시된다.

2 cols·rows — 크기 지정 방식
왜 px 단위가 아닌가?

cols는 가로 너비를, rows는 세로 높이를 지정한다. 단위가 픽셀이 아니라 글자 수와 줄 수라는 점이 독특하다. 폰트 크기나 브라우저 기본 글꼴에 따라 실제 크기가 달라질 수 있다.

<TEXTAREA cols="30" rows="5"></TEXTAREA> → 가로: 약 30글자 폭 → 세로: 5줄 높이 (스크롤 이후 내용 계속 입력 가능) → 현대 CSS 대안: style="width: 300px; height: 120px;"
※ CSS resize 속성으로 사용자가 직접 크기를 조절할 수 있게 하거나(resize: both) 고정(resize: none)할 수 있다.

3 nl2br() — 줄바꿈을 HTML에서 보이게 하기
왜 nl2br()이 필요한가?

TEXTAREA에서 엔터 키를 누르면 내부적으로 줄바꿈 문자(\n)가 삽입된다. 그런데 HTML은 줄바꿈 문자를 공백 한 칸으로 무시한다. 그래서 PHP로 그대로 출력하면 줄바꿈이 사라지고 한 줄로 붙어 나온다.

TEXTAREA 입력 내용 (PHP 내부 상태): "안녕하세요.\n오늘 날씨가 좋네요.\n반갑습니다." ↑ 엔터 키 = \n 그냥 print: 안녕하세요. 오늘 날씨가 좋네요. 반갑습니다. ← 한 줄로 붙음 nl2br() 적용: 안녕하세요.<br>\n오늘 날씨가 좋네요.<br>\n반갑습니다. ← 줄바꿈 됨
nl2br()\n을 지우는 게 아니라 \n 앞에 <br>을 삽입한다. 원본 줄바꿈 문자는 유지된다.
nl2br() 동작 원리
입력 문자열 nl2br() 결과 브라우저 표시
안녕\n반가워 안녕<br>\n반가워 두 줄로 표시
1줄\n2줄\n3줄 1줄<br>\n2줄<br>\n3줄 세 줄로 표시
줄바꿈 없음 변환 없음 (원본 그대로) 한 줄로 표시

 

반응형

 

4 print 여러 번 vs . 연결 — 무엇이 나은가
이 코드에서 print를 4번 쓴 이유

view.php에서는 print를 4번 나눠서 쓴다. 한 번에 연결할 수도 있지만, 초기 학습 단계에서는 단계별로 나누는 것이 흐름을 파악하기 쉽다.

// 4번 나눠서 출력 (이 코드 방식 — 읽기 쉬움) print $_POST["onamae"] . " 님으로부터의 메시지"; print "<BR><BR>"; print "본문 :<BR>"; print nl2br($_POST["honbun"]); // 한 번에 연결 (코드 짧음, 가독성은 낮음) print $_POST["onamae"] . " 님으로부터의 메시지<BR><BR>본문 :<BR>" . nl2br($_POST["honbun"]);
※ 어느 방식이든 결과는 동일하다. 팀이나 프로젝트에서 정한 스타일을 따르되, 가독성이 우선이다.

5 TEXTAREA 현대 속성 — HTML5 추가 기능
cols/rows 외에 알아두면 좋은 속성들

HTML5에서는 TEXTAREA에 편의 속성이 추가됐다. 실무에서 자주 사용하는 것들을 정리한다.

속성 역할 예시
placeholder 입력 전 힌트 텍스트 (입력하면 사라짐) placeholder="내용을 입력하세요"
maxlength 입력 가능한 최대 글자 수 제한 maxlength="500"
required 빈 값으로 제출 시 브라우저 경고 required
readonly 읽기 전용 — 표시는 되지만 수정 불가 readonly
disabled 비활성화 — 표시, 수정 모두 불가, 전송 제외 disabled
<!-- 현대적인 TEXTAREA 작성 예 --> <textarea name="honbun" style="width:100%; height:120px; resize:vertical;" placeholder="내용을 입력하세요 (최대 500자)" maxlength="500" required></textarea>
cols/rows로 크기를 고정하는 것보다 CSS width/heightresize: vertical을 함께 쓰는 것이 반응형에 유리하다.
disabled는 전송 제외라는 점이 readonly와 다르다. "제출은 하지 않지만 보여주고 싶은" 값에는 readonly, "아예 전송도 안 하는" 경우에는 disabled를 선택한다.

6 TEXTAREA와 XSS — htmlspecialchars() 적용
장문 입력에서 XSS 위험이 더 큰 이유

TEXTAREA는 여러 줄을 자유롭게 입력할 수 있어, INPUT보다 악성 스크립트를 삽입하기가 쉽다. nl2br()로 줄바꿈을 처리하기 전에 반드시 htmlspecialchars()로 감싸야 한다.

// 위험한 코드 (이 예제 방식 — 학습용) print nl2br($_POST["honbun"]); // 안전한 코드 (실무 표준 — 두 함수 중첩) print nl2br(htmlspecialchars($_POST["honbun"], ENT_QUOTES, 'UTF-8')); // ↑ 먼저 특수문자 변환 ↑ 그 결과에 nl2br 적용
※ 순서가 중요하다. htmlspecialchars()를 먼저 적용해 <script> 등을 무력화한 뒤, nl2br()로 <br>을 삽입해야 한다. 순서가 바뀌면 nl2br이 삽입한 <br>까지 엔티티로 변환돼 버린다.
※ 데이터베이스에 저장할 때는 htmlspecialchars()가 아니라 prepared statement(PDO/mysqli)로 SQL 인젝션을 막는다. htmlspecialchars()는 출력(HTML 표시) 전용 방어다.

7 데이터 흐름 전체 순서
1
사용자가 이름 + 본문 입력 후 "송신"onamae = "홍길동", honbun = "안녕하세요.\n오늘..."
2
POST로 view.php에 전달$_POST["onamae"], $_POST["honbun"] 세팅 — URL에 내용 노출 없음
3
이름 출력print로 "홍길동 님으로부터의 메시지" 출력
4
nl2br() 적용 후 본문 출력honbun 내 \n마다 <br> 삽입 → 각 줄이 HTML에서 구분되어 표시
5
브라우저 렌더링HTML을 파싱해 줄바꿈이 적용된 메시지 화면 표시

8 자주 하는 실수
실수 증상 해결
nl2br() 없이 TEXTAREA 내용 출력 줄바꿈이 전부 사라지고 한 줄로 붙어 나옴 print nl2br($_POST["key"]);
TEXTAREA 닫는 태그 누락 이후 HTML이 전부 TEXTAREA 안으로 들어감 </TEXTAREA> 반드시 명시
TEXTAREA에 value 속성 사용 기본값이 표시 안 됨 (value 무시) 기본값은 여는/닫는 태그 사이에 직접 입력
honbun vs honbon 오타 $_POST 배열 key 불일치로 빈 값 HTML name 속성과 PHP key 정확히 일치
nl2br 적용 순서 반대 <br>이 &lt;br&gt;로 그대로 출력됨 htmlspecialchars → nl2br 순서 유지
htmlspecialchars() 미적용 XSS 취약 — 스크립트 입력 시 실행 외부 입력 출력 전 반드시 적용

TEXTAREA 처리 실무 패턴 요약
  • 크기: CSS width/height + resize: vertical
  • 힌트: placeholder 속성으로 안내 문구 표시
  • 길이 제한: maxlength로 서버 부하 방지
  • 출력 순서: nl2br(htmlspecialchars($val)) — 안쪽에서 바깥쪽으로
  • 기본값: 태그 사이 텍스트로 지정 (value 속성 사용 불가)
  • readonly vs disabled: readonly는 전송 포함, disabled는 전송 제외

핵심 한 줄 요약

<TEXTAREA cols="30" rows="5">여러 줄 입력 요소 — INPUT text의 장문 버전
nl2br($_POST["honbun"])줄바꿈 문자(\n) → <br> 변환 — HTML에서 줄바꿈 유지
nl2br() 없이 출력엔터가 무시되어 모든 내용이 한 줄로 붙음
nl2br(htmlspecialchars($v))안전한 출력 — XSS 차단 후 줄바꿈 변환
기본값 설정value 속성 무효 — 태그 사이에 텍스트 직접 삽입

Tags

#PHP #TEXTAREA #nl2br #cols #rows #줄바꿈 #장문입력 #htmlspecialchars #placeholder #maxlength #POST폼 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, TEXTAREA, nl2br, cols, rows, 줄바꿈, 장문입력, htmlspecialchars, placeholder, maxlength, POST폼, 웹개발, 티스토리
반응형

댓글