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