Por que verificar o início e o fim de uma string em PHP?
\n\nImagine: 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().
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\nO que são str_starts_with e str_ends_with?
\n\nAmbas 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\nAssinatura das funções
\n\nstr_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
trueoufalse. \n
Exemplo mais simples
\n\necho str_starts_with('Olá, mundo!', 'Olá'); // true\necho str_ends_with('Olá, mundo!', 'mundo!'); // true\necho str_starts_with('Olá, mundo!', 'mundo'); // false\n\nImportante: 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.
Exemplos reais de uso
\n\n1. 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\nAntes, 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".
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\n3. 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\nComo funcionava antes (e por que as novas funções são melhores)
\n\nAntes do PHP 8.0, os desenvolvedores usavam várias abordagens. Vamos compará-las com as novas funções.
\n\nMé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\nDesvantagens do método antigo:
\n- \n
- Verborrágico: é necessário calcular o comprimento da substring. \n
- Risco de erro com comprimento negativo (se
$needlefor maior que$haystack). \n - Código menos legível. \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\nCom strpos, é fácil cometer um erro lógico: se não usar === 0, mas apenas == false ou == 0
Blogs
Book Recommendations
Leia também
Dominando o sistema de arquivos: trabalhando com arquivos em JavaScript
TypeScript para aprendizado de máquina: possibilidades práticas e limitações
Expressões lambda em C++: quando elas realmente aceleram o código?
Code Review em C++: o que verificar e como dar feedback para iniciantes
Swift para iniciantes: por onde começar em 2025