Convertir cadenas a su equivalente semántico

A menudo, necesitamos pasar una cadena de su forma real a una forma que se mucho más amigable con las URLs. Esto se realiza con objetivos de posicionamiento y SEO en general.

Imaginemos que tenemos una página dinámica que va mostrar una noticia.

El primer paso sería que reciba un ID como parámetro GET y muestre el contenido.

nuestroperiodico.com/noticia.php?id=23


El segundo paso sería poner el título urlencodeado ( nuevo palabro, usar funcion urlencode de tu lenguaje favorito) para que los robots de los motores de búsqueda vean reflejado en las url términos importantes del contenido.

nuestroperiodico.com/noticia.php?id=23&titulo=El+alcalde+ha+muerto


Pero, ¿que pasa si el título de la noticia contiene caracteres que no son muy agradables de urlencodear como acentos o símbolos? Para el título: "El Tráfico: Madrid colapsado por las obras" tendríamos esta url:

nuestroperiodico.com/noticia.php?id=23
&titulo=El+Tr%E1fico%3A+Madrid+colapsado+por+obras


Debemos convertir el título a algo más agradable para una url y para ello haremos los siguientes pasos:

  • Convertir la cadena a minúsculas
  • Quitar símbolos de puntuación y otros símbolos incomodos (como las barras y comillas)
  • Convertir los acentos a sus equivalentes sin acentuar (mas la ñ)


Mucho mejor, quedaría así:

nuestroperiodico.com/noticia.php?id=23
&titulo=el-trafico-madrid-colapsado-por-obras


Pero, ¿porqué pararnos aquí?, las url (en terminos SEO) tienen una longitud a partir de la cual no les gustan a los algoritmos de posicionamiento. Asi que vamos a dejar sólamente la información que realmente interesa. A nuestroperiodico no le interesará nunca posicionarse por los terminos "el" o "por", son términos tan comunes que no tienen ninguna relevancia. En términos de recuperación de información se denominan palabras vacías. Estaría bien tener un último filtro que nos quitara las palabras vacías dejando la url de nuestra noticia así:

nuestroperiodico.com/noticia.php?id=23
&titulo=trafico-madrid-colapsado-obras


¿Y cómo narices hago todo esto? Dejo un poquito de código para los interesados (para poder descargarlo solo pinchar encima de "plain text" y se pone en modo plano).



La vida después de esto

Esto sólo es un primer paso , el gran paso se da cuando se pone uno a juguetear con el mod_rewrite de Apache (otros servidores web tienen modulos o plugins con objetivos similares). No es el objetivo de este artículo pero con mod_rewrite llegaríamos a esta url (para lo que también usaríamos el proceso de conversión a cadenas semánticas):

nuestroperiodico.com/nacional/trafico-madrid-colapsado-obras/23


Código fuente

Determina si una palabra es vacía o no. Generalmente se tienen como mínimo las preposiciones y artículos. Se pueden ir añadiendo las que a cada uno le parezca más oportuno. Si la lista crece, no estaría nada mal sacarla a un fichero externo.

PHP:
  1. function esVacia($palabra)
  2. {
  3.     $esVacia = false;
  4.     $vacias = array("a", "ante", "bajo", "con", "contra", "de", "desde", "en",
  5.                     "entre", "hacia", "hasta", "para", "por", "segun", "sin", "so",
  6.                     "sobre", "tras", "durante", "mediante","la","las","los","el","y","del");
  7.     foreach($vacias as $v)
  8.     {
  9.         if($v==$palabra)
  10.         {
  11.             $esVacia = true;
  12.             break;
  13.         }
  14.     }
  15.     return $esVacia;
  16. }


Cambia los acentos y tildes por sus equivalentes.

PHP:
  1. function cambiaAcentos($str)
  2. {
  3.  if(is_utf($str))
  4.  {
  5.      $str = utf8_decode($str);
  6.  }
  7.  
  8.   $str = htmlentities($str);
  9.   $str = preg_replace('/&([a-zA-Z])(uml|acute|grave|circ|tilde);/','$1',$str);
  10.   return html_entity_decode($str);
  11. }



Pequeño apoyo para cadenas utf. No he probado mucho con ella (usar con cuidado).

PHP:
  1. function is_utf ($t)
  2. {
  3.  if ( @preg_match ('/.+/u', $t) )
  4.       return 1;
  5. }



Función maestra que convierte las cadenas a su equivalente semántico. Se le pasa como parámetro opcional la eliminación de palabras vacías. Cuidado con el orden de cambiar los acentos y pasar la cadena a minúsculas. Debe ser exactamente ese, ya que la función strtolower de php no pasa a minúsculas las mayúsculas acentuadas (o ñ).

PHP:
  1. function strtosem($str,$eliminaVacias=true)
  2. {
  3.  
  4.     $str = cambiaAcentos($str);
  5.     $str = strtolower($str);
  6.  
  7.     $str_partes = split("[ ()/']",trim($str));
  8.  
  9.  
  10.     if($eliminaVacias)
  11.     {
  12.  
  13.         $partes_destino = array();
  14.  
  15.         foreach($str_partes as $parte)
  16.         {
  17.             $parte = trim($parte);
  18.             if(!esVacia($parte) && !empty($parte))
  19.             {
  20.                 $partes_destino[] = $parte;
  21.             }
  22.         }
  23.         $str = implode("-",$partes_destino);
  24.     }
  25.     else
  26.     {
  27.         $str = implode("-",$str_partes);
  28.     }
  29.  
  30.  
  31.  
  32.     return $str;
  33.  
  34. }

4 Responses to “Convertir cadenas a su equivalente semántico”

  1. DUQUE Says:

    Ya tienes un fiel seguidor de tu blog Jejejeje, me parece super interesante todo lo que explicas y los ejemplos practicos que pones ni te digo, me vienen de perlas para hacer mis primeros pinitos programando .

    Pero por favor pon un RSS para que te pueda agregar a mi lector de FEED que con el nombrecito que le has puesto al blog como para escribirlo cada vez que quiero entrar.

    Venga un Saludo y mucha suerte

  2. CompuGlobalHiperMegaNet Says:

    Gracias, Duque.

    El tema de los RSS es accesible desde http//www.compuglobalhipermega.net/feed/. Intentaré que aparezca en un sitio mas visible el enlace.

    Un saludo

  3. Damian Says:

    me fue util agrege esto para quitar signos raros que no sean letras
    $parte= ereg_replace(”[^a-z]“, “”, $parte);
    y para asegurar al final
    $str = urlencode($str)

  4. Damian Says:

    Perdon,quedo asi:
    function cambiaAcentos($str)
    {
    $str = htmlentities($str);
    $str = preg_replace(’/&([a-zA-Z])(uml|acute|grave|circ|tilde);/’,'$1′,$str);
    return html_entity_decode($str);
    }

    function strtosem($str)
    {

    $str = cambiaAcentos($str);
    $str = strtolower($str);

    $str_partes = split(”[ ()/']“,trim($str));
    $partes_destino = array();
    foreach($str_partes as $parte)
    {
    if (!empty($parte)){
    $parte = trim($parte);
    $parte= ereg_replace(”[^a-z0-9]“, “”, $parte);
    $partes_destino[] = $parte;
    }
    }
    $str = implode(”-”,$partes_destino);

    $str = urlencode($str);//por si las dudas
    return $str;

    }

Leave a Reply

This is a captcha-picture. It is used to prevent mass-access by robots. (see: www.captcha.net)

Debes leer y teclear los 5 caracteres entre 0..9 y A..F, y enviar la respuesta.

  

No puedo leer esto. Por favor, generar un