Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Acortar texto en cadena sin cortar palabra

Estas en el tema de Acortar texto en cadena sin cortar palabra en el foro de PHP en Foros del Web. Buenas tardes. He estado buscando en Google opciones para esto que pretendo pero no doy con una solución correcta. He probado algunas funciones y me ...
  #1 (permalink)  
Antiguo 06/10/2020, 08:07
 
Fecha de Ingreso: diciembre-2004
Ubicación: Madrid
Mensajes: 550
Antigüedad: 19 años, 3 meses
Puntos: 28
Acortar texto en cadena sin cortar palabra

Buenas tardes.

He estado buscando en Google opciones para esto que pretendo pero no doy con una solución correcta. He probado algunas funciones y me dan error. La que más se aproxima es ésta

Código PHP:
function trimString $cadena$longitud 128 ) {
    
//Eliminamos las etiquetas HTML
    
$cadena trim strip_tags $cadena ) );
    
    if ( 
strlen $cadena ) > $longitud ) {
        
//Acortamos la cadena a la longitud dada
        
$cadena substr $cadena0$longitud );
        
        
//Expresión regular de espacio en blanco
        
$regExp "/[\s]| /";              
        
        
//Dividimos la cadena en palabras y la guardamos en un array        
        
$palabras preg_split $regExp$cadena, -1PREG_SPLIT_NO_EMPTY ); 
        
        
//Buscamos la expresión regular al final de la cadena
        
preg_match $regExp$cadena$ultimo0$longitud ); 
        
        if ( empty ( 
$ultimo ) ) {
            
//Si la última palabra no estaba seguida por un espacio en blanco,
            //la eliminamos del conjunto de palabras
            
array_pop $palabras );
        }
        
        
//Creamos la cadena resultante por la unión del conjunto de palabras
        
$cadena implode ' '$palabras ) . '…';
    }
    
    return 
$cadena;

Mi intención es mostrar un máximo de 68 caracteres porque creo títulos de páginas web a partir de páginas dinámicas. Entonces unos títulos pueden ocupar 65 caracteres y otros 85 o más. La intención es que muestre un máximo de 68 pero sin cortar la última palabra. Esa función lo hace bien pero como la última palabra lleve un carácter extraño, la cosa no sale bien.

Me explico. Si la última palabra dentro de los 68 caracteres que voy a mostrar es Madrid, la función lo hace bien. Pero si en vez de Madrid, la palabra es Çela (población de Albania), entonces se corta antes. Por ejemplo, "XXXXXX Madrid" (para Madrid) y "XXXXXX" (para Çela). La Ç evita que salga esa palabra a pesar de que debería salir porque tiene 4 caracteres frente a los 5 de Madrid, y esta palabra sí sale. No sé me explico. La cadena de Madrid es más larga que la de Çela y aún así sale Madrid pero no Çela...

No tengo claro qué tendría que tocar en esa función para que salgan palabras con caracteres especiales, o si merece la pena usar otra función.

Muchas gracias :)
  #2 (permalink)  
Antiguo 07/10/2020, 09:52
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Acortar texto en cadena sin cortar palabra

Viendo la lógica de la función, me parece que no tiene mucha lógica, porque:

1. Cortas la cadena sin tomar en cuenta si se va a cortar una palabra o no

2. No me queda claro porque se usa una expresión regular y preg_split() en lugar de explode(). Hay la posibilidad de que en la cadena existan entidades HTML como  ? Entonces creo que faltan validaciones al crear el contenido

3. Uso de preg_match() para saber si la cadena tenía un espacio al final o no y, dependiendo de eso, borrar el último elemento. Esto debió solventarlo el trim() y, además, estoy 99.99% seguro de que el punto 1 y este son la causa de tu problema y no los "caracteres raros" que, realmente, no son tan raros, pero eso es otro tema

Cita:
Iniciado por Ember
No tengo claro qué tendría que tocar en esa función para que salgan palabras con caracteres especiales, o si merece la pena usar otra función.
Creo que lo que merece la pena es entender qué hace cada cosa para poder aplicar los cambios necesarios.

Sugerencia:

1. Separa la cadena por espacios, solo con explode()

2. Podrías usar array_map() para recorrer los elementos y crear la nueva cadena
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 08/10/2020, 07:28
 
Fecha de Ingreso: diciembre-2004
Ubicación: Madrid
Mensajes: 550
Antigüedad: 19 años, 3 meses
Puntos: 28
Respuesta: Acortar texto en cadena sin cortar palabra

Muchas gracias por responder :)

Yo debo reconocer que mis conocimientos de PHP son bastante limitados, entonces pensé que podría lograr en algún sitio la función de manera directa y que me iba a funcionar de primeras, pero he visto que no.

A ver, la cadena está separada por espacios previamente. Pero hay una parte estática y una parte dinámica. La parta estática siempre es igual y la parte dinámica se construye por ciudad + región + país.

Es ahí donde viene el problema. Por ejemplo:

TEXTO FIJO + Madrid - Madrid - España
TEXTO FIJO + Santo Domingo - Santo Domingo - República Dominicana

La segunda cadena es demasiado larga y necesito acortarla. Si hago un substring me cortará cuando llegue a X caracteres pero quizás me corta por la mitad una palabra (por ejemplo, Domin en vez de Dominicana), y eso no me conviene. Me convendría que cortara, siguiendo con el ejemplo, cuando termine República.

Con substring: TEXTO FIJO + Santo Domingo - Santo Domingo - República Domin
Con función: TEXTO FIJO + Santo Domingo - Santo Domingo - República

Entiendo que tendría que coger la cadena de texto, hacer un subtring y en la nueva cadena, buscar el último espacio y borrar lo que sobre, ¿no?
  #4 (permalink)  
Antiguo 08/10/2020, 12:39
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Acortar texto en cadena sin cortar palabra

Suponiendo que ya verificaste que es más larga de lo que debería, una aproximación puede ser:

Código PHP:
Ver original
  1. // Cortar cadena por la longitud máximam para qué el  +1?
  2. $cadena = substr ( $cadena, 0, $longitud + 1 );
  3.  
  4. // Buscar el último espacio
  5. $espacio = strrpos($cadena, ' ');
  6.  
  7. // Cortar la cadena en donde aparece el espacio
  8. $cadena = substr ( $cadena, 0, $espacio );

Nota que se usa strrpos, es decir, str reverse position : https://www.php.net/manual/es/function.strrpos.php

Cosas que pueden fallar:
- Que no existan espacios (¿?)
- Que al final aparezca un espacio, necesitarías cambiar el último parámetro a $espacio - 1
- No hay control de entidades como  
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 10/10/2020, 03:39
 
Fecha de Ingreso: diciembre-2004
Ubicación: Madrid
Mensajes: 550
Antigüedad: 19 años, 3 meses
Puntos: 28
Respuesta: Acortar texto en cadena sin cortar palabra

Vale, ahora mi problema viene con lo último que has señalado. Resulta que en la base de datos de localidades que estoy usando (muy extensa, todo sea dicho), los caracteres especiales como la Ç, vienen escritos como Ç (por poner un ejemplo).

Claro, en la página web se ve como Ç pero la cadena que yo le paso a la función no es Çërriçë (en Albania) sino Çërriçë

La cuestión sería saber cómo convertir mediante PHP una cadena como Çërriçë en Çërriçë para que la función que acorta la cadena funcione a la perfección... En teoría me funciona con la función html_entity_decode()

Creo que con eso sí estaría todo bien, ¡muchas gracias!

Etiquetas: acortar, cadena, cortar, html, palabra
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:52.