¿Cómo puedo limitar el contenido de una API a 15 palabras (no caracteres) usando Angular 10+?

CorePress2024-01-25  13

Quiero limitar parte del contenido (que tiene más de 50 palabras aproximadamente) de mi API a 15 palabras. Estoy intentando crear una tubería pero no funciona. Las tuberías que encontré tienen límites, pero solo caracteres, no palabras. ..

Yo uso esto:

@Pipe({
  name: 'limitToPipe'
})
export class LimitToPipePipe implements PipeTransform {

  transform(value: string, limit: number): string {
    let trail = '...';

return value.length > limit ? value.substring(0, limit) + trail : value;


 }

}

Como dije antes, eso no es lo que quiero, porque necesito devolver 15 palabras y no caracteres.

¿Alguien puede ayudarme a hacer esto? Estoy perdido desde la mañana hasta la noche intentando hacer esto.



------------------------------------

En primer lugar, solo tenga en cuenta que debe decidir exactamente qué es una palabra, por ejemplo: ¿está incluyendo la puntuación en su definición de una palabra? ¿una palabra con guión cuenta como una o dos?rds...

No he verificado tu código, pero parece que tienes la tubería funcionando, ¿solo necesitas 15 palabras? Yo usaría una expresión regular, algo como esto:

transform (value: string, words: number): string {
  const regex = new RegExp(`((\W*\w+){0,${words}})`);
  const result = value.match(regex)[1];
  return result.length < value.length ? result + '...' : result;
}

La expresión regular es:

((\W*\w+){0,15}})

que coincide con 0 o más caracteres que no son palabras '\W+', seguidos de 1 o más caracteres de palabras '\w+', luego busca entre 0 y 15 coincidencias, tomando tantas como pueda encontrar (en caso de que su inicial cadena tiene menos de 15 palabras).

Si desea ser más específico acerca de qué caracteres incluir además de \W \w, puede cambiarlos por clases de caracteres explícitas. p.ej. para agregar un guión a los caracteres de las palabras (para convertir las palabras con guiones en una sola palabra):

transform (value: string, words: number): string {
  const chars='-A-Za-z0-9_';
  const regex = new RegExp(`(([^${chars}]*[${chars}]+){0,${words}})`);
  const result = value.match(regex)[1];
  return result.length < value.length ? result + '...' : result;
}

Construyendo una expresión regular de:

(([^-A-Za-z0-9_]*[-A-Za-z0-9_]+){0,15}})

Salud,

1

Muchas gracias Barney, por tu respuesta. Esto es muy útil para mí. No sabía mucho sobre expresiones regulares, pero esto podría ayudarme a aprender más al respecto. ¡Salud!

- Félix

28 de marzo de 2021 a las 8:34



------------------------------------

Puedes separar las palabras dividiéndolas en lugar de subcadenas. Verifique el siguiente código que divide las palabras y devuelve solo ellímite especificado,

import { Pipe, PipeTransform } from '@angular/core';
    
@Pipe({
   name: 'limitWords'
})
export class LimitWordsPipe implements PipeTransform {
   transform(value: any, limit: any): any {
      return value.length > limit ? value.split(' ').slice(0,limit).join(' ') + '...' :value;
   }
}

URL de la aplicación: https://limitwordspipe.stackblitz.io URL del editor: https://stackblitz.com/edit/limitwordspipe?file=src/app/limit-words.pipe.ts

4

Cuidado con los espacios dobles que a algunas personas les gustan después de un punto. 'El perro ladró. Tenía hambre.' se dividirá en ["El", "perro", "ladró", "", "Era", "hambriento"], y usted perder una palabra.

- Barney

28/03/2021 a las 7:00

Es posible que desees utilizar una expresión regular como split(' +') en su lugar, que no tendrá este problema.

- Barney

28 de marzo de 2021 a las 7:07

Gracias @Barney por detectarlo y mejorar aún más la respuesta.

- Ramanathan Chockalingam

28 de marzo de 2021 a las 7:18

Gracias por tu respuesta, por el tiempo que dedicaste a responder esto. Es muy útil para mí. Aprenderé más sobre reg exp. saludos!!

- Félix

28 de marzo de 2021 a las 8:36

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare