obtener las 3 primeras palabras de una frase en PHP

publicado por: Anonymous

Tengo una duda sobre como obtener las 2 o 3 primeras palabras de una frase. Por ejemplo:

Ejemplo_1:

$text_1 = "Chaleco azul con tejido algodón";
Resultado=> Chaleco azul

Ejemplo_2:

$text_2 = "Lampara de lectura para la cama";
Resultado=> Lampara de lectura

Ejemplo_3:

$text_3 = "Suave oso de peluche de color morado";
Resultado=> Suave oso peluche

Si os fijáis a veces puede coger el “DE”, como en el ejemplo 2, en cambio en el ejemplo 3 no coge el “DE”. No se como también se pueda discriminar la letras “DE”.

Digo yo… Si la siguiente palabra es superior a 4 caracteres, añádela de lo contrario no suprime el resto de palabras sobrantes…

Gracias de Antemano


Perdonarme, por haberme explicado tan mal. Os detallo mejor la idea y con mas ejemplos, y gracias por las rapidas respuestas. 😉

La idea es obtener siempre las 3 primeras palabras, salvo cuando en la 3º Posición se encuentre un “DE”. En cuyo caso incluiríamos la palabra que ocupa la 4º posición.

$Ejemplo_1= "zapatillas de fútbol para correr";

Resultado_1=> zapatillas de fútbol 

Como podéis observar en el Resultado_1, rescatamos siempre las 3 primeras palabras. En este caso el “DE” no acaba en la 3ºposición, por tanto el resultado estaría OK.

$Ejemplo_2= "15 metros de lona para el restaurante";

Resultado_2: 15 metros de lona

En el Resultado_2, si os fijáis en la 3º Posición acaba con un “DE”, por tanto se cumple el requisito que mencione arriba. Por tanto únicamente cogeremos la próxima palabra que esta en la 4º Posición.

$Ejemplo_3= "Tarjeta memoria kodak 15 fotografías HD";

Resultado_3: Tarjeta memoria kodak

En el Resultado_3, únicamente coge las 3 palabras, ya que no contiene ningún “DE”.

solución

He hecho un método algo genérico para lo que quieres:

function cortarFrase($frase, $maxPalabras = 3, $noTerminales = ["de"]) {
  $palabras = explode(" ", $frase);
  $numPalabras = count($palabras);
  if ($numPalabras > $maxPalabras) {
     $offset = $maxPalabras - 1;
     while (in_array($palabras[$offset], $noTerminales) && $offset < $numPalabras) { $offset++; }
     return implode(" ", array_slice($palabras, 0, $offset + 1));
  }
  return $frase;
}

Este método admite hasta tres parámetros:

  • $frase: la frase a recortar
  • $maxPalabras: el número de palabras con las que quieres quedarte. Parámetro opcional con valor inicial 3.
  • $noTerminales: una lista de las palabras con las que no debe terminar el recorte. Parámetro opcional con valor inicial [“de”]

Entonces lo que hace es romper la cadena y transformarla en un array (con explode). Si la cadena tiene 3 palabras o menos, se devuelve la cadena sin cambios; si tiene más de 3 palabras, entonces comprobar que la última palabra no está en la lista de palabras no permitidas como terminales (añadiendo una palabra más a la cadena si lo está).


Por ejemplo, usando esa función en el siguiente código:

<?php

$frase1 = "zapatillas de fútbol para correr";
$frase2 = "15 metros de lona para el restaurante";
$frase3 = "Tarjeta memoria kodak 15 fotografías HD";

function cortarFrase($frase, $maxPalabras = 3, $noTerminales = ["de"]) {
    $palabras = explode(" ", $frase);
    $numPalabras = count($palabras);
    if ($numPalabras > $maxPalabras) {
        $offset = $maxPalabras - 1;
        while (in_array($palabras[$offset], $noTerminales) && $offset < $numPalabras) { $offset++; }
        return implode(" ", array_slice($palabras, 0, $offset+1));
    }
    return $frase;
}


echo cortarFrase($frase1) . "n";
echo cortarFrase($frase2) . "n";
echo cortarFrase($frase3) . "n";
// quedarse con 4 palabras en lugar de 3
echo cortarFrase($frase1, 4) . "n";
// quedarse con 3 palabras, pero no puede terminar en "de" o "lona"
echo cortarFrase($frase2, 3, ["de", "lona"]) . "n";

obtendrá como resultado:

zapatillas de fútbol
15 metros de lona
Tarjeta memoria kodak
zapatillas de fútbol para
15 metros de lona para

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *