Estaba trabajando con algo similar, y se me ocurrió con esta pequeña pieza de código , también contempla el uso de caracteres latinos.
Esta es la cadena de ejemplo:
$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&?¡?*liz cardillo y kiwi. La cigüeña ¨^;.-|°¬tocaba el saxofón detrás del palenque de paja';
Primero convertir la cadena en htmlentities sólo para que sea más fácil de usar más tarde.
$friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false);
Entonces reemplazar caracteres latinos con sus correspondientes caracteres ASCII (á
se convierte en a
, Ü
convierte U
, y así sucesivamente):
$friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL);
Entonces convertir la cadena de vuelta de html entidades a símbolos, de nuevo para un uso más fácil más adelante.
$friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8");
siguiente que reemplazar todos los caracteres no alfanuméricos en guiones.
$friendlyURL = preg_replace('/[^a-z0-9-]+/i', '-', $friendlyURL);
elimino guiones adicionales dentro de la cadena:
$friendlyURL = preg_replace('/-+/', '-', $friendlyURL);
me retire anterior y posterior guiones:
$friendlyURL = trim($friendlyURL, '-');
Y finalmente convertir todo en minúsculas:
$friendlyURL = strtolower($friendlyURL);
Todos juntos:
function friendlyUrl ($str = '') {
$friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false);
$friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL);
$friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8");
$friendlyURL = preg_replace('/[^a-z0-9-]+/i', '-', $friendlyURL);
$friendlyURL = preg_replace('/-+/', '-', $friendlyURL);
$friendlyURL = trim($friendlyURL, '-');
$friendlyURL = strtolower($friendlyURL);
return $friendlyURL;
}
prueba:
$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&-?¡?*-liz cardillo y kiwi. La cigüeña ¨^`;.-|°¬tocaba el saxofón detrás del palenque de paja';
echo friendlyUrl($str);
Resultado:
el-veloz-murcielago-hindu-comia-fe-liz-cardillo-y-kiwi-la-ciguena-tocaba-el-saxofon-detras-del-palenque-de-paja
supongo que la respuesta de Gumbo se adapte a su problema mejor, y es un código más corto, pero pensé que sería útil para otros.
Saludos, Adriana
Es posible que desee dejar guiones cuando están directamente entre las palabras (por ejemplo, "algo" no se debe traducir a "algo") y otros casos especiales. –