PHP str_starts_with e str_ends_with: análise para iniciantes

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que verificar o início e o fim de uma string em PHP?

\n\n

Imagine: você está criando um site em PHP e precisa verificar se o nome do arquivo termina com .jpg? Ou se o email começa com admin? Antes, para isso, era necessário escrever gambiarras com substr() ou expressões regulares. Mas a partir do PHP 8.0, temos uma solução elegante — as funções str_starts_with() e str_ends_with().

\n\n

Isso não é apenas açúcar sintático. São formas rápidas, legíveis e seguras de trabalhar com strings que todo desenvolvedor PHP deve conhecer. Neste artigo, vamos analisá-las com exemplos reais, compará-las com abordagens antigas e mostrar como evitar erros comuns.

\n\n

O que são str_starts_with e str_ends_with?

\n\n

Ambas as funções surgiram no PHP 8.0 (lançado em novembro de 2020). Elas resolvem uma tarefa simples: verificar se uma string contém um determinado prefixo (início) ou sufixo (fim).

\n\n

Assinatura das funções

\n\n
str_starts_with(string $haystack, string $needle): bool\nstr_ends_with(string $haystack, string $needle): bool
\n\n
    \n
  • $haystack — a string onde procuramos (palheiro).
  • \n
  • $needle — a substring que procuramos (agulha).
  • \n
  • Retornam true ou false.
  • \n
\n\n

Exemplo mais simples

\n\n
echo str_starts_with('Olá, mundo!', 'Olá'); // true\necho str_ends_with('Olá, mundo!', 'mundo!');   // true\necho str_starts_with('Olá, mundo!', 'mundo');  // false
\n\n

Importante: as funções são sensíveis a maiúsculas/minúsculas. str_starts_with('PHP', 'php') retornará false. Se você precisar de comparação sem distinção de maiúsculas/minúsculas, use strtolower() ou strtoupper() em ambas as strings.

\n\n

Exemplos reais de uso

\n\n

1. Verificar extensão de arquivo

\n\n
$filename = 'relatorio_2024.pdf';\n\nif (str_ends_with($filename, '.pdf')) {\n    echo "É um documento PDF";\n} elseif (str_ends_with($filename, '.jpg')) {\n    echo "É uma imagem";\n} else {\n    echo "Formato desconhecido";\n}
\n\n

Antes, isso era feito com substr($filename, -4) — era fácil errar o comprimento do sufixo. Agora o código se lê como inglês comum: "a string termina com".

\n\n

2. Validação de URL ou email

\n\n
$email = 'usuario@gmail.com';\n$url = 'https://pythonlib.ru';\n\nif (str_ends_with($email, '@gmail.com')) {\n    echo "Usuário do Gmail";\n}\n\nif (str_starts_with($url, 'https://')) {\n    echo "Conexão segura";\n}
\n\n

3. Filtrar array de strings

\n\n
$files = ['imagem.jpg', 'documento.pdf', 'foto.png', 'anotacoes.txt'];\n\n$images = array_filter($files, function($file) {\n    return str_ends_with($file, '.jpg') || str_ends_with($file, '.png');\n});\n\nprint_r($images); // ['imagem.jpg', 'foto.png']
\n\n

Como funcionava antes (e por que as novas funções são melhores)

\n\n

Antes do PHP 8.0, os desenvolvedores usavam várias abordagens. Vamos compará-las com as novas funções.

\n\n

Método 1: substr()

\n\n
// Método antigo: verificar início\nif (substr($string, 0, strlen('prefixo')) === 'prefixo') { ... }\n\n// Método novo\nif (str_starts_with($string, 'prefixo')) { ... }
\n\n

Desvantagens do método antigo:

\n
    \n
  • Verborrágico: é necessário calcular o comprimento da substring.
  • \n
  • Risco de erro com comprimento negativo (se $needle for maior que $haystack).
  • \n
  • Código menos legível.
  • \n
\n\n

Método 2: strpos()

\n\n
// Método antigo: verificar início\nif (strpos($string, 'prefixo') === 0) { ... }\n\n// Método novo\nif (str_starts_with($string, 'prefixo')) { ... }
\n\n

Com strpos, é fácil cometer um erro lógico: se não usar === 0, mas apenas == false ou == 0

Blogs

Book Recommendations