domingo, 16 de octubre de 2011

Crear Urls Limpias de acentos con Codeigniter

Esta ves les voy a hablar de la función url_title de el helper url de codeigniter, la cual es muy útil para crear direcciones web validas y limpias de una manera fácil, y ademas también les voy a dejar una versión mejorada de esta función para que también limpien de acentos las url, que es lo único que le hace falta a esta librería.

La función lo que hace es eliminar cualquier carácter extraño de la cadena de texto pasada, utilizando expresiones regulares, dejando solamente los caracteres de la a-z y modificando los espacios a "-" o "_".

La ejemplos de uso de la función url_title().

echo url_title('buen día'); //da como salida "buen-da"

echo url_title("Vas para caracas?? o que?!!!?<{{}"); // da como resultado"Vas-para-carcas??-o-que?!!!?"


Como evitar que url_title() elimine los acentos


Ahora bien, para lograr esto lo primero que debemos hacer es crear nuestra propia version del URL helper, para esto en la carpeta application/helpers creamos un archivo llamado MY_url_helper.php, (OJO usamos MY_ si ese es el prefijo que tenemos establecido en nuestro archivo de configuración) y dentro del archivo colocamos lo siguiente:

function url_title($str, $separator = 'dash', $lowercase = FALSE)
{
  $str=strtr($str,$array=array("À"=> "A","Á"=>"A","Â"=>"A","Ã"=>"A","Ä"=>"A","Å"=>"A","à"=>"a","á"=>"a","â"=>"a","ã"=>"a","ä"=>"a","å"=>"a","Ò"=>"O","Ó"=>"O","Ô"=>"O","Õ"=>"O","Ö"=>"O","Ø"=>"O","ò"=>"o","ó"=>"o","ô"=>"o","õ"=>"o","ö"=>"o","ø"=>"o","È"=>"E","É"=>"E","Ê"=>"E","Ë"=>"E","è"=>"e","é"=>"e","ê"=>"e","ë"=>"e","Ç"=>"C","ç"=>"c","Ì"=>"I","Í"=>"I","Î"=>"I","Ï"=>"I","ì"=>"i","í"=>"i","î"=>"i","ï"=>"i","Ù"=>"U","Ú"=>"U","Û"=>"U","Ü"=>"U","ù"=>"u","ú"=>"u","û"=>"u","ü"=>"u","ÿ"=>"y","Ñ"=>"N","ñ"=>"n"));
  if ($separator == 'dash')
  {
   $search  = '_';
   $replace = '-';
  }
  else
  {
   $search  = '-';
   $replace = '_';
  }

  $trans = array(
      '&\#\d+?;'    => '',
      '&\S+?;'    => '',
      '\s+'     => $replace,
      '[^a-z0-9\-\._]'  => '',
      $replace.'+'   => $replace,
      $replace.'$'   => $replace,
      '^'.$replace   => $replace,
      '\.+$'     => ''
     );

  $str = strip_tags($str);

  foreach ($trans as $key => $val)
  {
   $str = preg_replace("#".$key."#i", $val, $str);
  }

  if ($lowercase === TRUE)
  {
   $str = strtolower($str);
  }
  return trim(stripslashes($str));
 }

Cave destacar que esta función es la misma de codeigniter lo único es que le e agregado una linea para que también reemplace los caracteres que tienen acentos por los normales.

Tambien si quieres pueden agregar esta funcion: que elimina los "-" y los "_" de la caeena que se el pase, más o menos trabaja a la inversa de url_title().

function inv_url_title($str,$lowercase = FALSE)
{
 $str = preg_replace("#[_-]+#i", ' ', $str);
 if ($lowercase === TRUE)
 {
  $str = strtolower($str);
 }
 return $str;
}




2 comentarios:

  1. Hola sabes al moment de imprimir mi url_title no modifica la url solo la imprime en la vista tú sabes por que?

    ResponderEliminar
    Respuestas
    1. la verdad es que no, has modificado la funcion como hice yo en el tutorial o es la basica de codeigniter?

      Eliminar