Convertir string a url friendly en PHP

Esta función la suelo necesitar bastante a menudo. Por curiosidad me puse a buscar y encontré ésta función que convierte cadenas de texto a formato url:

NOTA: En Laravel tenemos la opción de usar Str::slug() que funciona más o menos bien.

function Slug($string)
{
    return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')), ENT_QUOTES, 'UTF-8')), '-'));
}

La función para convertir a formato «url-friendly» paso a paso

Para entender mejor lo que hace esta función la he descompuesto en varias con un nombre descriptivo que indica lo que se hace en cada paso:

function convertirCaracteresEnEquivalentesHtml($string)
{
    return htmlentities($string, ENT_QUOTES, 'UTF-8');
}

function reemplazarCaracteres($string)
{
    return preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', $string);
}

function convertirSimbolosHtmlEnCaracteres($string)
{
    return html_entity_decode($string, ENT_QUOTES, 'UTF-8');
}

function eliminarCaracteresQueNoSeanLetrasNumeros($string)
{
    return preg_replace('~[^0-9a-z]+~i', '-', $string);
}

function eliminarGuionesDelComienzoYFinal($string)
{
    return trim($string, '-');
}

function slug($string)
{
    return strtolower( 
        eliminarCaracteresQueNoSeanLetrasNumeros(
            convertirSimbolosHtmlEnCaracteres(
                reemplazarCaracteres(
                    convertirCaracteresEnEquivalentesHtml($string)
                )
            )
        )
    );
}

Y para que se vea más claramente he creado una función de apoyo:

function mostrarPaso($nombreFunción, $string)
{
    echo "[$nombreFunción] " . str_repeat(" ", 50 - strlen($nombreFunción));
    $stringModificada = $nombreFunción($string);
    echo $stringModificada . PHP_EOL;
    return $stringModificada;
}

Que nos va a ayudar a ver paso a paso lo que hace cada función:

$cadena = "no me seas ñoño el día 30/10/2019   #20 Ácido---&@";
echo $cadena . PHP_EOL;
$cadena = mostrarPaso('convertirCaracteresEnEquivalentesHtml', $cadena);
$cadena = mostrarPaso('reemplazarCaracteres', $cadena);
$cadena = mostrarPaso('convertirSimbolosHtmlEnCaracteres', $cadena);
$cadena = mostrarPaso('eliminarCaracteresQueNoSeanLetrasNumeros', $cadena);
$cadena = mostrarPaso('eliminarGuionesDelComienzoYFinal', $cadena);
$cadena = mostrarPaso('strtolower', $cadena);

echo slug($cadena) . PHP_EOL;

Con la que tendríamos este resultado:

no me seas ñoño el día 30/10/2019   #20 Ácido---&@
 [convertirCaracteresEnEquivalentesHtml]              no me seas ñoño el día 30/10/2019   #20 Ácido---&@
 [reemplazarCaracteres]                               no me seas nono el dia 30/10/2019   #20 Acido---&@
 [convertirSimbolosHtmlEnCaracteres]                  no me seas nono el dia 30/10/2019   #20 Acido---&@
 [eliminarCaracteresQueNoSeanLetrasNumeros]           no-me-seas-nono-el-dia-30-10-2019-20-Acido-
 [eliminarGuionesDelComienzoYFinal]                   no-me-seas-nono-el-dia-30-10-2019-20-Acido
 [strtolower]                                         no-me-seas-nono-el-dia-30-10-2019-20-acido
 no-me-seas-nono-el-dia-30-10-2019-20-acido

Deja un comentario