substr()
La función substr() en PHP extrae una parte de una cadena. Es muy útil en aplicaciones de texto para recortar prefijos, tomar los primeros N caracteres y más.
La función substr() devuelve un fragmento de una cadena: los caracteres entre una posición de inicio y una longitud opcional. Es una de las herramientas de cadenas más utilizadas en PHP: recortar prefijos, tomar los primeros N caracteres de una etiqueta, leer un campo de ancho fijo u obtener una extensión de archivo se reducen a una llamada a substr(). Esta página cubre la sintaxis, todos los comportamientos de los argumentos $start y $length (incluidos los negativos), los casos límite que suelen causar problemas y cuándo usar mb_substr() en su lugar.
Sintaxis
substr(string $string, int $offset, ?int $length = null): string| Parámetro | Descripción |
|---|---|
$string | La cadena de entrada de la que se extrae. |
$offset | Posición de inicio basada en cero. Un valor negativo cuenta desde el final de la cadena. |
$length | Opcional. Cuántos caracteres se devolverán. Omítalo (o pase null) para leer hasta el final de la cadena. Un valor negativo significa "detener este número de caracteres antes del final." |
substr() devuelve la subcadena extraída. A partir de PHP 8.0 siempre devuelve una cadena (una cadena vacía cuando no hay coincidencia); antes de PHP 8.0 devolvía false en caso de fallo, por lo que aún puede verlo en código antiguo.
Un ejemplo básico
$offset es 0, por lo que la extracción comienza en el primer carácter, y $length es 5, por lo que se devuelven cinco caracteres (Hello). Recuerde que el offset está basado en cero: la posición 0 es H, la posición 1 es e, y así sucesivamente.
Cómo funciona el offset
Un offset positivo cuenta desde el inicio; un offset negativo cuenta desde el final (donde -1 es el último carácter):
<?php
$string = "Hello World!";
echo substr($string, 6); // World! — from offset 6 to the end
echo "\n";
echo substr($string, -6); // World! — last 6 characters
echo "\n";
echo substr($string, -1); // ! — just the last characterOmitir $length devuelve todo a partir del offset en adelante, lo cual es práctico para eliminar un prefijo conocido.
Cómo funciona la longitud
Un $length positivo limita cuántos caracteres se toman. Un $length negativo se detiene ese número de caracteres antes del final de la cadena, lo que es ideal para eliminar un sufijo conocido:
<?php
$string = "Hello World!";
echo substr($string, 0, -1); // Hello World — drop the trailing "!"
echo "\n";
echo substr($string, -6, 5); // World — start 6 from the end, take 5
echo "\n";
echo substr($string, 4, 0); // (empty) — length 0 returns ""Si la longitud solicitada supera el final de la cadena, substr() simplemente devuelve lo que está disponible; nunca genera un error por ser "demasiado larga."
Uso práctico: una extensión de archivo
Combinar substr() con strrpos() (que encuentra la última posición de un carácter) es la forma clásica de leer una extensión de archivo:
<?php
$filename = "report.final.pdf";
$ext = substr($filename, strrpos($filename, ".") + 1);
echo $ext; // pdfProblemas comunes
- Offset fuera de rango. Si
$offsetes mayor que la longitud de la cadena, obtendrá una cadena vacía (en PHP 8+). No da la vuelta. - Cuenta bytes, no caracteres.
substr()trabaja con bytes. Para texto UTF-8 con letras acentuadas o emoji, cortar en medio de un carácter produce resultados incorrectos. Usemb_substr()para una extracción segura con multibyte. - Error por uno en la longitud.
$lengthes un conteo, no un índice final.substr($s, 2, 3)devuelve 3 caracteres comenzando en el índice 2, no los caracteres entre el índice 2 y el índice 3.
Funciones relacionadas
strlen()— obtener la longitud de una cadena, que se usa frecuentemente para calcular un$length.strpos()— encontrar dónde comienza una subcadena, para pasarlo asubstr().explode()— dividir una cadena en un array cuando se tiene un delimitador.trim()— eliminar espacios en blanco (u otros caracteres) de ambos extremos.