Skip to content

Dividindo Mensagens Longas para Redes Sociais: Um Utilitário PHP para Limites de Caracteres ​

Introdução ​

Ao construir chatbots, ferramentas para redes sociais ou aplicações com IA, você inevitavelmente enfrentará um desafio comum: o texto que você quer enviar é maior do que a plataforma permite.

DMs do Instagram têm limite de 1.000 caracteres. Twitter/X limita posts a 280 caracteres. Mensagens SMS são divididas em 160 caracteres. E quando você trabalha com respostas geradas por IA, elas raramente respeitam esses limites.

A abordagem ingênua—cortar o texto exatamente no limite de caracteres—resulta em palavras quebradas e mensagens ilegíveis. O que você precisa é uma divisão inteligente que respeite os limites das palavras e produza partes limpas e legíveis.

O Problema ​

Considere este cenário: seu assistente de IA gera uma resposta de 3.000 caracteres para uma consulta de cliente. Você precisa enviá-la via DM do Instagram (limite de 1.000 caracteres). Simplesmente cortar na posição 1000 pode produzir:

...e a melhor abordagem seria reconfi

Ao invés de:

...e a melhor abordagem seria

Seus usuários merecem algo melhor.

A Solução ​

Aqui está uma função utilitária PHP que divide mensagens longas em limites naturais—espaços e quebras de linha—respeitando seu limite de caracteres:

php
public static function splitMessageByLength(string $message, int $length = 4096): array
{
    // Normaliza quebras de linha para \n
    $message = str_replace("\r\n", "\n", $message);
    $message = str_replace("\r", "\n", $message);

    $messages = [];
    $current_message = '';

    // Percorre a mensagem caractere por caractere
    for ($i = 0, $count = mb_strlen($message, 'UTF-8'); $i < $count; $i++) {
        $char = mb_substr($message, $i, 1, 'UTF-8');

        // Adiciona o caractere
        $current_message .= $char;

        // Verifica se a mensagem atual excede o limite
        if (mb_strlen($current_message, 'UTF-8') >= $length) {
            // Encontra a última ocorrência de espaço ou quebra de linha
            $lastSpace = mb_strrpos($current_message, ' ', 0, 'UTF-8');
            $lastBreak = mb_strrpos($current_message, "\n", 0, 'UTF-8');

            // Determina a posição de corte (prefere quebra de linha sobre espaço)
            $splitPos = $lastBreak !== false ? $lastBreak : $lastSpace;

            // Se não houver espaço ou quebra, força corte no limite máximo
            if ($splitPos === false || $splitPos === 0) {
                $splitPos = $length;
            }

            // Adiciona o trecho atual ao array de mensagens
            $messages[] = mb_substr($current_message, 0, $splitPos, 'UTF-8');

            // Inicia o próximo trecho com o conteúdo restante
            $current_message = mb_substr($current_message, $splitPos, null, 'UTF-8');
        }
    }

    // Adiciona o restante se houver
    if (!empty($current_message)) {
        $messages[] = $current_message;
    }

    // Limpeza: remove espaços e filtra strings vazias
    $messages = array_map('trim', $messages);
    $filtered_messages = array_filter($messages, function ($message) {
        return (bool) $message;
    });

    return array_values($filtered_messages);
}

Como Funciona ​

O algoritmo segue estes passos:

  1. Normaliza quebras de linha - Converte quebras Windows (\r\n) e Mac antigo (\r) para estilo Unix (\n) para tratamento consistente.

  2. Percorre caractere por caractere - Usa funções multibyte seguras (mb_strlen, mb_substr) para tratar corretamente caracteres Unicode como emojis e letras acentuadas.

  3. Detecção inteligente de limites - Quando o limite é atingido, procura para trás pelo último espaço ou quebra de linha. Quebras de linha são preferidas pois representam pontos de divisão mais naturais.

  4. Fallback para casos extremos - Se não existir ponto de divisão adequado (ex: uma única palavra muito longa), força a divisão no limite exato.

  5. Limpeza - Remove espaços de cada trecho e elimina strings vazias que possam resultar da divisão.

Exemplos de Uso ​

Uso Básico ​

php
$mensagemLonga = "Esta é uma mensagem muito longa que precisa ser dividida...";
$partes = TextUtil::splitMessageByLength($mensagemLonga, 100);

foreach ($partes as $indice => $parte) {
    echo "Parte " . ($indice + 1) . ": " . $parte . "\n";
}

Limites Específicos por Plataforma ​

php
class DivisorMensagens
{
    const INSTAGRAM_DM = 1000;
    const TWITTER = 280;
    const SMS = 160;
    const WHATSAPP = 4096;
    const TELEGRAM = 4096;

    public static function paraInstagram(string $mensagem): array
    {
        return TextUtil::splitMessageByLength($mensagem, self::INSTAGRAM_DM);
    }

    public static function paraTwitter(string $mensagem): array
    {
        return TextUtil::splitMessageByLength($mensagem, self::TWITTER);
    }

    public static function paraSMS(string $mensagem): array
    {
        return TextUtil::splitMessageByLength($mensagem, self::SMS);
    }
}

Com Respostas de IA ​

php
// Obtém resposta da IA (pode ser muito longa)
$respostaIA = $anthropicService->chat($prompt);

// Divide para envio via DM do Instagram
$partes = TextUtil::splitMessageByLength($respostaIA, 1000);

foreach ($partes as $parte) {
    $instagramApi->sendDirectMessage($userId, $parte);
    // Adiciona delay para manter ordem das mensagens
    usleep(500000); // 500ms
}

Referência de Limites por Plataforma ​

PlataformaLimiteNotas
Instagram DM1.000Por mensagem
Instagram Legenda2.200Truncada em 125 no feed
Twitter/X280Usuários premium têm mais
SMS160Maior = múltiplos segmentos
WhatsApp4.096Por mensagem
Telegram4.096Por mensagem
Facebook Post63.206Mas 40-80 caracteres é ideal
LinkedIn3.000Truncado em 140 no feed

Engajamento Ideal

Estudos mostram que mensagens mais curtas geram melhor engajamento. Posts no Twitter com menos de 100 caracteres têm 17% mais engajamento. Legendas do Instagram entre 138-150 caracteres performam melhor.

Melhorias a Considerar ​

Adicionando Números das Partes ​

php
public static function dividirComNumeros(string $mensagem, int $limite): array
{
    $partes = self::splitMessageByLength($mensagem, $limite - 10); // Reserva espaço
    $total = count($partes);

    if ($total === 1) {
        return $partes;
    }

    return array_map(function ($parte, $indice) use ($total) {
        return $parte . "\n\n(" . ($indice + 1) . "/" . $total . ")";
    }, $partes, array_keys($partes));
}

Preservando Estrutura de Parágrafos ​

php
public static function dividirPorParagrafos(string $mensagem, int $limite): array
{
    $paragrafos = explode("\n\n", $mensagem);
    $partes = [];
    $atual = '';

    foreach ($paragrafos as $paragrafo) {
        $teste = $atual ? $atual . "\n\n" . $paragrafo : $paragrafo;

        if (mb_strlen($teste, 'UTF-8') <= $limite) {
            $atual = $teste;
        } else {
            if ($atual) {
                $partes[] = $atual;
            }
            // Se parágrafo único excede limite, usa divisão por caractere
            if (mb_strlen($paragrafo, 'UTF-8') > $limite) {
                $partes = array_merge($partes,
                    self::splitMessageByLength($paragrafo, $limite));
                $atual = '';
            } else {
                $atual = $paragrafo;
            }
        }
    }

    if ($atual) {
        $partes[] = $atual;
    }

    return $partes;
}

Considerações sobre Emojis

Emojis podem ter 1-4 bytes mas contam como 1-2 caracteres dependendo da plataforma. Teste cuidadosamente com conteúdo rico em emojis para garantir divisão precisa.

Conclusão ​

Dividir mensagens longas pode parecer trivial, mas fazer corretamente—respeitando limites de palavras, tratando Unicode adequadamente e limpando os resultados—faz a diferença entre uma aplicação profissional e uma experiência frustrante para o usuário.

Os principais pontos:

  • Sempre use funções de string multibyte para segurança Unicode
  • Prefira pontos de divisão naturais (quebras de linha > espaços > cortes forçados)
  • Limpe os resultados removendo espaços e filtrando trechos vazios
  • Considere otimizações específicas por plataforma para seu caso de uso

Este utilitário se torna especialmente valioso ao integrar serviços de IA em plataformas de mensagens, onde o tamanho das respostas é imprevisível e os limites de caracteres são rigorosos.