<?php function cambiar_url($url) { $url = strtolower($url); $buscar = array(' ', '&', 'rn', 'n', '+'); $url = str_replace ($buscar, '-', $url); $buscar = array('á', 'é', 'í', 'ó', 'ú', 'ñ'); $remplzr = array('a', 'e', 'i', 'o', 'u', 'n'); $url = str_replace ($buscar, $remplzr, $url); $buscar = array('/[^a-z0-9-<>]/', '/[-]+/', '/<[^>]*>/'); $remplzr = array('', '-', ''); $url = preg_replace ($buscar, $remplzr, $url); return $url; } ?>
Así de simple es cambiar acentos por las mismas letras sin la tilde, y los espacios quedan con un guón. Entonces explicando todo paso a paso la función se compone de lo siguiente. Primero pasamos todo a minúscula:
$url = strtolower($url);
Luego creamos un arreglo que contendrá los caracteres o símbolos a buscar, lo llamamos por ejemplo "$buscar", y otro con los que serán reemplazados en la misma posición del arreglo anterior, podemos llamarlo "$remplzr". Después de esto hacemos lo mismo pero con un arreglo para los acentos (sin usar otras variables para no complicarnos), y el último es para otros caracteres especiales, tanto el de los espacios como caracteres especiales los reemplazamos por un guión ( - ), pero podemos cambiarlo por cualquier otra cosa que queramos, de modo que va así la función con respecto a los arreglos.
//Primer arreglo $buscar = array(' ', '&', 'rn', 'n', '+'); $url = str_replace ($buscar, '-', $url); //Segundo arreglo $buscar = array('á', 'é', 'í', 'ó', 'ú', 'ñ'); $remplzr = array('a', 'e', 'i', 'o', 'u', 'n'); $url = str_replace ($buscar, $remplzr, $url); //Tercer arreglo $buscar = array('/[^a-z0-9-<>]/', '/[-]+/', '/<[^>]*>/'); $remplzr = array('', '-', ''); $url = preg_replace ($buscar, $remplzr, $url); return $url;
Por último retornamos la variable y listo, ya solo queda llamar la función desde nuestro PHP.
<?php cambiar_url($mi_cadena) ?>
Recomiendo utilizar esto mas que todo para un arreglo donde tengamos muchos enlaces con acentos o cuando cargamos data de una base de datos como nombres y queremos utilizarlos en enlaces y propiedades, todo es cuestión de probar y comprar resultados.
Recibe notificaciones por correo
9 Comentarios
Escribir Comentariohola
Respondertu post me ha sido de gran utilidad, pero tengo una pregunta que de pronto sabes...
He ejecutado la función para construir urls amigables en una serie de links, las url's van bien con su correspondiente función en el .htaccess, pero la info del link, pasa modificada al archivo que la ejecuta... y no la reconoce..
Conoces alguna forma de devolver la función (en este caso volver a poner las tildes) después de constrida la url, y antes de que pase al archivo de destino ????
Bueno, tienes 2 posibles soluciones:
Responder- La primera es que cuentes la cantidad de caracteres antes de cada acento en cada palabra y retornes el valor.
- La otra es que almacenes en la variable los acentos como tal y solo utilices la función para lo que vayas a utilizar, de forma que cuando quieras mostrar la cadena original muestres la variable que no ha sido modificada en ningún momento.
También, si lo vez complicado, crea 2 variables, una con la cadena sin acentos y otra con la original... Saludos!
Me parece que la última opción sería la mejor, porque los datos que van al archivo de destino son muchos y muy diferentes (es un archivo de búsqueda para nombres en php), pero lo he intentado y no me funciona, no ejecuta la función con la cadena original, te pongo un ejemplo de como estoy construyendo los links, depronto ahí esta el fallo:
Responder' . $product_info['nombre'] . ''
?>
el cambio lo ejecuto en el .htaccess así:
RewriteRule ^nombre-(.*).html$ archivo_busqueda.php?nombre=$1&% [QSA,NC,L]
y luego tengo la función para conservar el original no se como escribirla, se me ocurre algo asi, aunque creo que esta mal...
Lo siento... tu ventana me da error al intentar insertar el código etiquetado,
ResponderBueno, primero tienes que formatearlo, fíjate en la primera entrada del blog, tienes el parse para publicar código, ahora bien....
ResponderSi lo que quieres hacer es en PHP para que utilizas el .htaccess? No es mas simple utilizar el método POST o GET? Y si lo que quieres es algo en tiempo real, pues tienes jQuery, .htaccess no debería usarse para este tipo de cosas....
La verdad es que he tomado cosas de aquí y de allí para intentar construir la solución, pero no soy programador...
ResponderEstoy usando el hatccess para hacer la reescritura de la url, ahí se hace el cambio de la variable nombre, por el nombre real.
Pero la función de búsqueda que esta en archivo_busqueda.php, ejecuta el nombre ya cambiado con tu función (para eliminar tildes, mayusculas etc... en la url), la función se ejecuta bien, y la url va bien, pero necesito recuperar el nombre original (con tildes, etc..) para construir los títulos en el archivo de destino (archivo_busqueda.php)
Vuelvo a poner el link:
<?php
'<br><a href="' . cambiar_url($product_info['nombre']) . '" />' . $product_info['nombre'] . '</a>'
?>
Bueno, ahora hazte con una variable por url, por ejemplo:
Responderecho "href=".cambiar_url($product_info['nombre'])."&texto_original=".$product_info;
Y dentro del archivo de busqueda para recuperar la variable colocas:
$el_texto = $_GET['texto_original'];
Espero no enredarte mucho... Aún el blog lo tengo en construcción y no he modificado el post de códigos en los comentarios.... Saludos!!
creo que me voy acercando ...
Responderpero no me va la función, la he escrito así:
function texto_original($string) {
$nombre = trim($string);
return $nombre;
}
también he intentado hacer un preg_replace_callback, pero tampoco me funciona.
No entiendo porque haces esto.... Pero dime algo, sabes como funciona el GET de PHP?? Si no es así te recomiendo leas un poco la documentación: $_GET['variable']
ResponderPartiendo de esto:
echo "href=archivo_busqueda.php".cambiar_url($product_info['nombre'])."&texto_original=".$product_info['nombre'];
Y en tu archivo php (el del enlace que es archivo_busqueda.php) colocas esto:
$nombre = $_GET['texto_original'];
Y si quieres hacer un trim entonces puedes hacer:
$nombre = trim($_GET['texto_original']);
O también:
$nombre = $_GET['texto_original'];
$nombre = trim($nombre);
Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.
Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión