반응형
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 태그
기본값: value 속성
이름, 전화번호, 이메일 등 단답형
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/height와 resize: 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>이 <br>로 그대로 출력됨 | 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폼, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| PHP 되돌아가기 버튼 + isset() — 다중 Submit 분기 완전 정리 (0) | 2026.07.12 |
|---|---|
| PHP 확인 화면 + hidden — 3단계 폼 완전 정리 (0) | 2026.07.12 |
| PHP POST 폼 기초 — form + view 완전 정리 (0) | 2026.07.11 |
| PHP preg_match() — 정규식 패턴 매칭 · 입력 검증 · 그룹 캡처 완전 정리 (0) | 2026.07.11 |
| PHP header(Location) — 페이지 리다이렉션 · exit 필수 · 301/302 완전 정리 (0) | 2026.07.11 |
왕진 블로그

댓글