Quebra de linha no PHP: nl2br, PHP_EOL e quando usar

Em PHP, a quebra de linha que funciona no terminal não funciona no navegador. Para terminal e arquivos use \n ou a constante PHP_EOL (cross-platform Windows/Linux/Mac). Para exibir no navegador use nl2br() que converte \n em <br> do HTML, ou escreva a tag <br> direto na string. A escolha depende inteiramente de onde o resultado vai aparecer.

A tabela abaixo resume os quatro caminhos com o caso ideal de cada um:

MétodoCaso idealFunciona no navegador?
\nTerminal, arquivos .txt, logs simplesNão (HTML ignora)
PHP_EOLScripts CLI portáveis Windows/Linux/MacNão (HTML ignora)
nl2br($texto)Texto vindo de formulário pra exibir no siteSim
"<br>" direto na stringHTML estático gerado pelo PHPSim

A diferença entre quebrar linha no terminal e no navegador

O navegador não respeita quebras de linha do código-fonte HTML. Mesmo que o PHP imprima \n, no navegador o texto aparece corrido sem pular linha. Isso confunde quem está começando porque o \n parece “não estar funcionando”. Está funcionando, só não da forma esperada.

A explicação técnica: HTML colapsa qualquer sequência de espaços em branco (incluindo quebras de linha) em um único espaço. Para o navegador renderizar quebra de linha real, é obrigatório usar a tag <br> ou um elemento de bloco como <p> que naturalmente cria espaçamento.

No terminal, em arquivos .txt e em logs do servidor, o \n funciona normalmente como quebra de linha visual porque esses contextos não interpretam HTML. A regra prática: identifique primeiro ONDE o texto vai aparecer, depois escolha o método.

Usando \n para terminal, arquivos e logs

O caractere \n é a forma mais simples de quebrar linha em PHP, mas só funciona dentro de aspas duplas. Aspas simples tratam \n como dois caracteres literais (barra invertida + letra n), o que é a pegadinha número 1 de quem está começando.

<?php
// Funciona corretamente (aspas duplas)
echo "Linha 1\nLinha 2";

// NÃO funciona (aspas simples imprimem literal \n)
echo 'Linha 1\nLinha 2';
?>

No terminal, o primeiro exemplo imprime:

Linha 1
Linha 2

O segundo imprime literalmente Linha 1\nLinha 2 sem quebrar nada. Esse erro silencioso confunde muito porque o PHP não acusa nenhum problema, simplesmente trata como texto puro.

Para escrever quebra de linha em arquivo .txt:

<?php
$conteudo = "Primeira linha\nSegunda linha\nTerceira linha";
file_put_contents("saida.txt", $conteudo);
?>

O arquivo gerado vai ter três linhas separadas quando aberto em qualquer editor de texto. Para abrir no Bloco de Notas do Windows e exibir corretamente em todas as versões, vale usar a próxima opção: PHP_EOL.

Usando PHP_EOL para código cross-platform

A constante PHP_EOL é a versão cross-platform do \n. Ela retorna \n (LF) quando o script roda em Linux ou Mac, e \r\n (CRLF) quando roda em Windows. Isso garante que arquivos gerados pelo PHP fiquem com o final de linha correto do sistema operacional onde estão sendo executados.

<?php
echo "Linha 1" . PHP_EOL;
echo "Linha 2" . PHP_EOL;
echo "Linha 3" . PHP_EOL;
?>

Esse código funciona idêntico em qualquer servidor. No Windows, gera arquivos compatíveis com Bloco de Notas e Excel. No Linux, gera arquivos limpos com \n. Em Mac moderno, também gera \n.

Quando usar PHP_EOL em vez de \n:

  • Scripts CLI que vão rodar em Windows e Linux
  • Geração de arquivos .txt.csv que precisam ser lidos por aplicativos do sistema
  • Logs que vão ser processados por ferramentas como tailgrepawk
  • Geração de cabeçalhos de email (SMTP exige CRLF em alguns servidores)

Quando NÃO usar PHP_EOL:

  • Quando o resultado vai aparecer no navegador (use nl2br() ou <br>)
  • Em strings JSON (use \n explícito porque JSON exige LF)
  • Em queries SQL geradas dinamicamente (não precisa de quebra real)

documentação oficial do PHP sobre PHP_EOL cita que essa constante existe especificamente para “garantir portabilidade entre plataformas”.

Função nl2br() para converter \n em <br> no HTML

A função nl2br($texto) recebe uma string com \n e devolve a mesma string com <br /> inserido ANTES de cada \n. É a forma correta de exibir no navegador um texto que veio com quebras de linha de outra fonte (formulário, banco de dados, arquivo).

<?php
$mensagem = "Olá, tudo bem?\nObrigado por entrar em contato.\nResponderemos em breve.";

echo nl2br($mensagem);
?>

A saída no navegador renderiza três linhas separadas como esperado. O HTML gerado fica assim:

Olá, tudo bem?<br />
Obrigado por entrar em contato.<br />
Responderemos em breve.

Observe que nl2br() mantém o \n original na string. Ele apenas INSERE <br /> antes. Para remover o \n deixando só o <br />, combine com str_replace:

<?php
$html = str_replace("\n", "", nl2br($mensagem));
echo $html;
?>

A função aceita um segundo parâmetro opcional booleano. Por padrão gera <br /> (XHTML). Passando false, gera <br> (HTML5):

<?php
echo nl2br($mensagem, false); // gera <br> em vez de <br />
?>

Para HTML5 moderno (a forma usada em 2026), <br> sem barra é o padrão recomendado.

Tag <br> direto na string para HTML estático

Quando o texto está sendo gerado dentro do próprio código PHP (não vem de formulário ou banco), escrever <br> direto na string é o caminho mais limpo e dispensa qualquer função.

<?php
$html = "Bem-vindo ao site<br>";
$html .= "Hoje é " . date("d/m/Y") . "<br>";
$html .= "Boa visita!";

echo $html;
?>

Esse padrão é ideal para:

  • Templates HTML construídos dinamicamente no PHP
  • Emails HTML enviados via mail() com Content-Type: text/html
  • Mensagens de erro ou aviso geradas pelo backend
  • Saídas curtas que não precisam ser formatadas como parágrafo

Quando o texto tem vários parágrafos, vale usar <p> em vez de múltiplos <br>. A regra de boa prática: <br> para quebra de linha dentro de um parágrafo, <p> para separar parágrafos diferentes.

Aspas simples vs aspas duplas: a pegadinha do \n

O PHP trata aspas simples e aspas duplas de forma diferente, e isso afeta diretamente o funcionamento do \n. Aspas duplas interpretam sequências de escape (\n\t\r) e expandem variáveis. Aspas simples tratam tudo como literal.

Comparação direta:

<?php
$nome = "Maria";

// Aspas DUPLAS: \n quebra linha, $nome é interpolado
echo "Olá, $nome\nBem-vinda!";
// Saída: Olá, Maria
//        Bem-vinda!

// Aspas SIMPLES: \n e $nome são literais
echo 'Olá, $nome\nBem-vinda!';
// Saída: Olá, $nome\nBem-vinda!
?>

A confusão acontece porque a maioria dos tutoriais usa aspas duplas sem explicar a diferença. Quem copia código com aspas simples acha que o PHP está bugado.

Regra prática:

Quando usarAspas
Texto com \n\t, variáveis $xDuplas
Texto puramente literal sem escapeSimples (mais rápido)
HTML com atributos class="..."Simples (evita escapar)
String com apóstrofo no meio (it's)Duplas

Aspas simples são marginalmente mais rápidas porque o PHP não precisa analisar o conteúdo. Em código que roda milhões de vezes essa diferença aparece. Em código normal, escolha pela legibilidade.

Quebra de linha em formulário <textarea>

Quando o usuário digita uma mensagem em <textarea> apertando Enter, o PHP recebe \n na variável $_POST. Para exibir essa mensagem de volta no site mantendo as quebras de linha, use nl2br().

<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $mensagem = $_POST["mensagem"] ?? "";

    // Sempre escape o conteúdo antes de exibir (XSS)
    $mensagem_segura = htmlspecialchars($mensagem, ENT_QUOTES, "UTF-8");

    // nl2br depois do htmlspecialchars pra preservar as quebras
    echo nl2br($mensagem_segura);
}
?>

<form method="POST">
  <textarea name="mensagem" rows="5"></textarea>
  <button type="submit">Enviar</button>
</form>

A ordem das funções importa: htmlspecialchars() PRIMEIRO (para neutralizar XSS), nl2br() DEPOIS (para preservar quebras). Inverter essa ordem quebra a segurança porque nl2br() insere <br> que htmlspecialchars() depois transforma em &lt;br&gt; literal.

Para salvar a mensagem no banco de dados, salve o texto puro com \n (sem nl2br()). A conversão pra <br> acontece só na exibição. Isso mantém o dado limpo para outros usos (envio por email, exportação, busca).

wordwrap() para quebrar linhas longas automaticamente

A função wordwrap() quebra automaticamente uma string longa em um número máximo de caracteres por linha. Útil quando você não controla onde o usuário digitou as quebras, mas precisa garantir que linhas não passem de determinado tamanho.

<?php
$texto = "Este é um texto muito longo que precisa ser quebrado em múltiplas linhas para caber em uma largura específica sem cortar palavras no meio.";

echo wordwrap($texto, 40, "\n", true);
?>

Os quatro parâmetros são:

  1. A string original
  2. Largura máxima por linha (em caracteres)
  3. Caractere de quebra (\n para terminal, <br> para HTML)
  4. Booleano true para forçar quebra mesmo em palavras longas

Caso típico de uso real: enviar emails de texto puro respeitando o limite de 78 caracteres recomendado pelo RFC 5322. Outro uso comum: gerar PDFs com linhas que cabem em coluna estreita.

5 erros comuns ao quebrar linha em PHP

Usar \n com aspas simples: o PHP trata como texto literal. Sempre use aspas duplas quando precisar de escape.

Esperar que \n apareça no navegador: HTML ignora quebras de linha do código. Use nl2br() ou <br> para exibição web.

Aplicar nl2br() em texto que já tem <br>: gera quebras duplas inesperadas. Aplique nl2br apenas no texto bruto do formulário, nunca em HTML pronto.

Salvar <br> no banco de dados: dificulta outros usos do texto. Salve sempre texto limpo com \n e converta na hora da exibição com nl2br().

Inverter ordem de htmlspecialchars() e nl2br(): aplicar nl2br() antes faz o htmlspecialchars() escapar a tag <br> em &lt;br&gt;. A ordem correta sempre é htmlspecialchars() primeiro, nl2br() depois.

Para entender melhor como o PHP se relaciona com geração de HTML em projetos completos, vale ver como criar site em HTML do zero que cobre a estrutura semântica usada como destino do PHP.

A documentação oficial da função nl2br no PHP.net traz a referência completa com todos os detalhes técnicos.

O vídeo do canal Gabriel Souto explica em detalhes sobre as quebras de linha e estrutura de instruções como complemento prático. Vale a pena dar uma conferida.

Perguntas frequentes

Por que \n não funciona no meu PHP?

Provavelmente você está usando aspas simples em vez de aspas duplas. Aspas simples tratam \n como texto literal. Troque 'Texto\n' por "Texto\n" e funcionará. Se mesmo com aspas duplas o texto não quebra no navegador, é porque HTML ignora \n. Use nl2br() ou <br> para exibição web.

Qual a diferença entre \nPHP_EOL e <br>?

\n é o caractere de nova linha do Unix/Linux/Mac, usado para terminal e arquivos texto. PHP_EOL é cross-platform, retorna \n em Linux/Mac e \r\n em Windows, ideal para arquivos que precisam ser portáveis. <br> é a tag HTML que cria quebra de linha real no navegador.

Como pular linha em PHP para exibir no navegador?

Use a função nl2br($texto) que converte \n em <br> automaticamente, ou escreva <br> direto na string PHP. Exemplo: echo nl2br("Linha 1\nLinha 2"); exibe duas linhas separadas no navegador.

O que é a constante PHP_EOL?

PHP_EOL é uma constante que representa o caractere de final de linha do sistema operacional onde o script está rodando. Em Linux e Mac retorna \n. Em Windows retorna \r\n (CRLF). Use quando precisar gerar arquivos texto compatíveis com qualquer SO.

Como quebrar linha em texto vindo de um <textarea>?

<textarea> envia \n ao apertar Enter. Para exibir no navegador mantendo as quebras, aplique htmlspecialchars() primeiro (para segurança contra XSS) e depois nl2br(). Exemplo: echo nl2br(htmlspecialchars($_POST["mensagem"], ENT_QUOTES, "UTF-8"));.

Quando devo usar nl2br() em vez de <br> direto?

Use nl2br() quando o texto vem de fonte externa (formulário, banco de dados, arquivo). Use <br> direto quando você está gerando o HTML no próprio PHP. A regra é simples: se você não controla as quebras de linha originais, use nl2br(). Se você está escrevendo o texto na hora, use <br> direto.

wordwrap() serve para quê?

Para quebrar automaticamente uma string longa a cada X caracteres. Útil para envio de emails em texto puro (limite de 78 caracteres por linha), geração de PDFs com colunas estreitas e qualquer caso onde linhas muito longas precisam ser dobradas em pedaços menores. Aceita \n ou <br> como caractere de quebra.

Por que devo usar <br> e não <br /> em 2026?

<br> é a sintaxe HTML5, padrão recomendado desde 2014. <br /> é XHTML, ainda funciona por compatibilidade mas é considerado verboso e desatualizado. Para projetos novos, sempre use <br> sem barra. Em nl2br() passe false como segundo parâmetro para gerar <br> em vez de <br />.

O que é PHP
Picture of Sara Lima
Sara Lima

Criadora do Meu Site Web e trabalha com criação de sites, WordPress e Elementor há mais de 8 anos. Jornalista por formação, une escrita e tecnologia para criar conteúdo prático sobre desenvolvimento web acessível a qualquer pessoa.

Últimos Posts