Formatear automáticamente la meta descripción con PHP
Esta función PHP coge el texto que le pases (Ej. el texto de una página web), limita el número de caracteres y devuelve solo palabras enteras sin superar el límite de caracteres. He creado esta función para formatear automáticamente la meta descripción de webs dinámicas pero se puede usar en cualquier situación que exija un número limitado de caracteres.
function limit_chars_words($string, $char_limit = 150) {
// limitar el número de caracteres y devolver solo palabras enteras
$string = preg_replace('/<(p|br)s*>/i', ' ', $string);
$string = strip_tags($string);
$orig_str_length = strlen($string);
$words = explode(' ', $string);
$i=0;
$str_length = 0;
while ($str_length < $char_limit) {
$str_length = $str_length + strlen($words[$i])+1;
$new_words[$i] = $words[$i];
$i++;
}
$string = implode(' ', $new_words);
if (strlen($string) > $char_limit) {
$new_words = explode(' ', $string);
$word_count = count($new_words);
$word_limit = $word_count - 1;
$string = implode(' ', array_slice($new_words, 0, $word_limit));
}
if ($orig_str_length > strlen($string)) { $string = "$string..."; }
return $string;
}





¡Ei! Gracias David, me viene genial para una optimización de un site que estoy haciendo.
Yo añadiría una pequeña mejora que he tenido que aplicar y es que si la cadena que recibes es más corta pues te devuelve espacios en blanco al final. Sé que hay una manera más fina de solucionarlo, pero yo he hecho otra muy efectiva también (jaja):
$string = trim ($string);Con lo cual:
function limit_chars_words($string, $char_limit = 150) {// limitar el número de caracteres y devolver solo palabras enteras
$string = strip_tags($string);
$orig_str_length = strlen($string);
$words = explode(' ', $string);
$i=0;$str_length = 0;
while ($str_length < $char_limit) {
$str_length = $str_length + strlen($words[$i])+1;
$new_words[$i] = $words[$i];
$i++;
}
$string = implode(' ', $new_words);if (strlen($string) > $char_limit) {$new_words = explode(' ', $string);
$word_count = count($new_words);
$word_limit = $word_count - 1;
$string = implode(' ', array_slice($new_words, 0, $word_limit));
}
if ($orig_str_length > strlen($string)) { $string = "$string..."; }$string = trim ($string);
return $string;
}
Por cierto, otro “problemilla” que me había encontrado es que tenía que hacer una meta descripción (150 caracteres) a partir de una cadena que tenía tags html. Y claro, a mi sólo me intersa coger el contenido para la meta description. Es decir, tenía que coger la descripción de un string en HTML.
La solución es fácil:
strip_tags($string);Por si a alguien le sirve.
Buena idea lo de quitar los espacio del final. No me había fijado que tenía ese efecto.
P.D. La función original ya tiene un strip_tags($string).
Pregunta de ignorante:
para hacer esto necesito trabajar con base de datos, ¿verdad?
Lo digo porque me vendría de perlas este método, pero yo los textos los tengo dentro de variables php (porque no tengo ni idea de bases de datos)
saludos
Hola Dani,
No, es independiente. Piensa que ésto sólo es una función a la que vas a llamar. Lo único que debes mandarle como parámetro a esta función es la variable donde tengas un texto a partir del cuál quieras crear la meta descripción. Opcionalmente también puedes mandarle el número de caracteres máximo que quieres que te ocupe la meta_description. Para llamar la función:
$meta_decription = limit_chars_words($mi_texto);O sino:
$meta_decription = limit_chars_words($mi_texto, 120);De donde saques la variable $mi_texto es otro tema, no tiene que provenir de ninguna base de datos. El primer caso como máximo tendrás 150 caracteres y en el segundo caso como máximo tendrás 120.
Luego lo que tendrás que poner en la página será:
< meta name="description" content="< ?=$meta_decription?>" />ok, muchas gracias,
lo provaré..
saludos
ei!
ya lo tengo funcionando! fue muy fácil,
yo tambien necesitaba eliminar los tags html de la descripción ya que yo lo hacia a saco, poniendo todo un texto a piñon con los tags y excediendo el numero de palabras..
Así que ahora genial.. gracias por la aclaración Sara y felicidadesa posicionapro por el blog y la web, a mi me esta sirviendo de mucho, mi web cada vez es mas seo friendly desde que os leo…
la herramienta nueva Rewrite Rule Generator es genial tb! gracias!!!!
saludos
Me alegro de que te sea útil el blog. Es un placer tenerte como participante.
Veo que nadie recordó cerrar la función con un ” } ” :O
¿Estás seguro? No veo ningún { abierto. La acabo de probar. Funciona perfectamente y no da ningún error lo cual me hace pensar que la función está bien. No obstante, si ves algún { sin cerrar, ¿me puedes decir dónde para que lo arregle?
Hola, tengo problemas para aplicar esta funcion en un texto con parrafos.
El codigo se almacena en base de datos mysql como codigo html.
Lo que hace es que, el final de cada linea de texto se junte con el principio de la siguiente:
Texto ejemplo de la primer lineaAca empieza la segunda linea yAca la tercer linea de texto.
Alguna idea?
Saludos!
Reemplaza:
$string = strip_tags($string);con:
$string = preg_replace('//i', ' ', $string);$string = strip_tags($string);Hola David, muchas gracis por responder, te cuento que cambiando la funcion como me comentas me genera otro problema y es que me muestra el codigo html, donde cada caracter es separado por espacios.
T I T U L O D E L A N O T I C I A & n b s p ; – S U B T I T U L O – F e c h a d e l a n o t i c i a : 8 d e f e b r e r o d e 2 0 1 0
Saludos!