Cómo obtener el último carácter de un string en PHP: guía completa para principiantes y expertos
\n\nImagina esta situación: estás escribiendo un script que debe verificar si un correo electrónico termina en @gmail.com, o necesitas extraer la última letra del nombre de un usuario. Parece una tarea sencilla: obtener el último carácter de un string en PHP. ¡Pero no te confíes! Incluso en un problema tan simple hay trampas ocultas, especialmente cuando hablamos de español con tildes, emojis o caracteres especiales.
Según datos de Stack Overflow, la pregunta "How to get the last char of a string in PHP?" acumula miles de visitas cada mes. Y no es casualidad: los principiantes suelen tropezar con substr() usando índices negativos, mientras que los desarrolladores experimentados debaten sobre rendimiento y compatibilidad con UTF-8.
En este artículo analizaremos 5 métodos funcionales, mostraremos ejemplos reales de código y daremos recomendaciones claras. ¡Empecemos!
\n\nMétodo #1: El clásico — substr() con índice negativo
\n\nLa forma más popular y concisa. La función substr() acepta un valor negativo en la longitud para contar caracteres desde el final del string.
<?php\n$string = "Hola, Mundo!";\n$lastChar = substr($string, -1);\necho $lastChar; // Muestra: !\n?>\n\nVentajas:
\n- \n
- Corto y fácil de entender \n
- Rápido en ejecución \n
Desventajas:
\n- \n
- No soporta codificaciones multibyte (tildes, eñes, caracteres chinos) \n
- Puede devolver un carácter "roto" para strings UTF-8 \n
Ejemplo del problema con caracteres acentuados:
\n\n<?php\n$string = "Canción";\n$lastChar = substr($string, -1);\necho $lastChar; // Muestra: � (signo de interrogación en rombo)\n?>\n\n¿Por qué ocurre esto? Porque letras como la "ó" ocupan 2 bytes en UTF-8, y substr() trabaja con bytes, no con caracteres. Para texto en inglés este método es ideal, pero para proyectos multilingües no lo es.
Método #2: El correcto — mb_substr() para strings multibyte
\n\nSi tu proyecto trabaja con Unicode (hoy en día es prácticamente obligatorio), usa mb_substr() de la extensión mbstring.
<?php\n$string = "¡Hola, mundo!";\n$lastChar = mb_substr($string, -1);\necho $lastChar; // Muestra: !\n?>\n\nY ahora lo más interesante: trabajar con emojis:
\n\n<?php\n$string = "👋 Hola 🌍";\n$lastChar = mb_substr($string, -1);\necho $lastChar; // Muestra: 🌍\n?>\n\nVentajas:
\n- \n
- Maneja correctamente cualquier codificación (UTF-8, UTF-16, etc.) \n
- Funciona con emojis y caracteres especiales \n
Desventajas:
\n- \n
- Requiere la extensión mbstring instalada (presente en casi todos los hosting) \n
- Un poco más lento que
substr()\n
Método #3: Alternativa — str_split() y end()
\n\nPuedes dividir el string en un array de caracteres y tomar el último elemento. Se ve elegante, pero tiene un detalle.
\n\n<?php\n$string = "PHP";\n$chars = str_split($string);\n$lastChar = end($chars);\necho $lastChar; // Muestra: P\n?>\n\nAtención: str_split() tampoco funciona bien con strings multibyte. Para caracteres acentuados o eñes, debes usar preg_split() con el flag Unicode:
<?php\n$string = "Código";\n$chars = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);\n$lastChar = end($chars);\necho $lastChar; // Muestra: o\n?>\n\nVentajas:
\n- \n
- Código intuitivo y fácil de leer \n
- Puedes obtener fácilmente no solo el último, sino cualquier carácter \n
Desventajas:
\n- \n
- Consume más memoria (se crea un array) \n
- Más lento que las funciones directas \n