récupérer du texte dans une chaine de caractère

Eléphanteau du PHP | 12 Messages

29 avr. 2014, 10:49

Tiens, je pense que ça peut t'aider :
<?php

// ici je génère juste un texte
$monText = '';
for( $i = 0; $i <30; $i++ ) {
	$monText .= "mot$i ";
}

// on explose tout ça
$monArray = explode(" ", $monText);

$i = 0; // notre compteur

// on continue tant qu'on n'a pas atteind la fin de notre array
while( $i < sizeof($monArray) )  {
	// on charge nos mots
	$mot1 = $monArray[$i];
	$mot2 = $monArray[$i+1];
	$mot3 = $monArray[$i+2];
	
	// on les affiche
	echo "$mot1 $mot2 $mot3 <br/>";
	
	// on incrémente notre compteur
	$i += 3;
}

Mammouth du PHP | 2278 Messages

29 avr. 2014, 11:33

Voici un exemple développé
<?PHP
$texte = "Il fait beau ce matin. La pluie a cessé hier. Et les hirondelles volent les porte-manteaux.";
$phrases = explode(".", $texte);
/*il faut éliminer le dernier élément du tableau, qui est une phrase vide
Si tu ne comprend pas, décommente la ligne suivante */
//print_r($phrases);
$p = array_pop($phrases);
$extraits = array();
$i = 1;
foreach($phrases as $phrase)
{
	/*Il faut éliminer les espaces éventuels en début et en fin de phrase sinon on va trouver des mots vides*/
	$mots = explode (" ", trim($phrase));
	for ($j = 0; $j <3; $j++)
	{
		$extraits[$i][$j] = ($mots[$j]!= "") ? $mots[$j] : "";
	}
	$i++;
/*on aurait un meilleur traitement avec strtok*/
}
print_r($extraits);

?>
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 19 Messages

29 avr. 2014, 11:43

Merci je n'avais pas vu les réponses en page 2. J'ai réussit tout seul avec un autre code. Est-ce que celui-ci te semble correct ? Est-il mieux ou moins bien que le tien et pourquoi ? Merci.



$test2 = "Mon texte que je veux séparer en 3 mots"
$teste = explode(" ", $test2);
$nombre_element=count($teste);
for ($i=O; $i<$nombre_element; $i+3)
{
if (!empty($i));
{
$mot1= $teste[$i+0];
$mot2= $teste[$i+1];
$mot3= $teste[$i+2];
echo $mot1." ".$mot2." ".$mot3."<br/>";
$i = $i + 3;
}
}

Eléphanteau du PHP | 12 Messages

29 avr. 2014, 11:54

Dans ta boucle for, tu calcules $i+3, mais tu ne donnes pas la valeur à ta variable, elle reste donc à 0.

J'imagine que c'est la cause de ton "!empty($i)" et de ton "$i = $i + 3" à la fin.

En modifiant juste ça, on obtient le code suivant, ce qui est nettement mieux (sauf erreur de ma part) :
$test2 = "Mon texte que je veux séparer en 3 mots"
$teste = explode(" ", $test2);
$nombre_element=count($teste);
for ($i=O; $i<$nombre_element; $i = $i+3)
{
$mot1= $teste[$i+0];
$mot2= $teste[$i+1];
$mot3= $teste[$i+2];
echo $mot1." ".$mot2." ".$mot3."<br/>";

}
Personnellement je trouve ça pas mal, mais je suis pas un expert ^^

Eléphanteau du PHP | 19 Messages

29 avr. 2014, 12:00

En fait j'ai fait mis le empty car j'ai des entrées vide dans mon tableau qui me génère dans lignes sans résultat et je souhaite les supprimer.

Ca n'est pas pareil la syntaxe suivante?

for ($i=O; $i<$nombre_element; $i = $i+3)

for ($i=O; $i<$nombre_element; $i+3)

Eléphanteau du PHP | 12 Messages

29 avr. 2014, 12:05

Dans ce cas il faudrait tester quand tu assigne le contenu de ton array :
$test2 = "Mon texte que je veux séparer en 3 mots"
$teste = explode(" ", $test2);
$nombre_element=count($teste);
for ($i=O; $i<$nombre_element; $i = $i+3)
{
$mot1= !empty($teste[$i+0]) ? $teste[$i+1] : '';
$mot2= !empty($teste[$i+1]) ? $teste[$i+2] : '';
$mot3= !empty($teste[$i+2]) ? $teste[$i+3] : '';
echo $mot1." ".$mot2." ".$mot3."<br/>";

}
Après ce code affichera le retour à la ligne même si tu n'as que deux variables (ou moins) à afficher, si tu souhaites le retour à la ligne uniquement à 3, un simple compteur pour l'affichage du "<br/>" devrait suffire

Eléphanteau du PHP | 12 Messages

29 avr. 2014, 12:07

En fait j'ai fait mis le empty car j'ai des entrées vide dans mon tableau qui me génère dans lignes sans résultat et je souhaite les supprimer.

Ca n'est pas pareil la syntaxe suivante?

for ($i=O; $i<$nombre_element; $i = $i+3)

for ($i=O; $i<$nombre_element; $i+3)
Dans le second cas, tu calcules la valeur égale à $i +3, mais sans jamais l'assigné à $i, ta variable restera donc à 0.

En d'autres termes tu crées une boucle infinie, ce qui est assez mauvais.

Je ne sais pas si mon explication est précise ^^"

Eléphanteau du PHP | 19 Messages

29 avr. 2014, 12:15

Ok top merci.

Maintenant plutot que de les afficher je les stocké dans un tableau

$tab1[] = $mot1." ".$mot2." ".$mot3."<br/>";

J'ai fait la meme chose avec un autre texte donc j'ai un deuxieme tableau

$tab2[] = $mot1." ".$mot2." ".$mot3."<br/>";

Et j'aimerai concatener à la suite toutes les lignes du tableau de chaque texte avec la structure suivante

$tab1[0] $tab2[0] $tab1[1] $tab2[1] $tab1[2] $tab2[2], etc.....

Donc il faudrait que j'utilise un foreach je pense mais la je coince vraiment.

Eléphanteau du PHP | 12 Messages

29 avr. 2014, 12:47

Je peux pas tester maintenant, je te donne rapidement la méthode que j'appliquerais :

> tu regardes lequel de tes deux tableaux est le plus grand, tu mets cette valeur dans une boucle
> tu parcours tes tableaux, et tu concatènes tes deux tableaux dans ton string s'ils ne sont pas vide

Je pense pas qu'il y ait plus que ça ^^"

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 avr. 2014, 15:25

Bonjour,

Je voudrais créér un script qui me permettrait de récupérer les 3 premiers mots de chaque phrase dans un texte défini.

pour cela je pense qu'il faudrait que je créé une boucle pour parcourir tous le texte mais j'ai beau chercher j'avoue que je bloque.

Avez-vous une idée svp ??

Merci.
salut,

Il n'y a que moi que cela choque un explode sur un espace pour ne prendre que les 3 premiers index du tableau généré ? (sur un pharse de 6 mots, cela passe mais sur cinquante mots ?).

utiliser stpos et sustr semble tout aussi indiqué.

exemple
<?php

$chaine = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sed.';

$pos1 = strpos($chaine, ' ');
$pos2 = strpos($chaine, ' ', $pos1 + 1);
$pos3 = strpos($chaine, ' ', $pos2 + 1);

$mot1 = substr($chaine, 0, $pos1);
$mot2 = substr($chaine, $pos1 + 1, $pos2 - $pos1 - 1);
$mot3 = substr($chaine, $pos2 + 1, $pos3 - $pos2 - 1);

echo 'La chaine <br/>', $chaine, '<br /> le 1er mot : |', $mot1, '|<br /> le 2ème : |', $mot2, '|<br />', 'le 3ème : |', $mot3, '|';
reste a mettre cela dans une fonction pour faire propre et l'ajouter la séparation des phrases.
personnes n'utilise trim histoire d'éviter les problèmes s'il y a un espace en début de chaines ?
Ce qui va fatalement arriver si tu "split" sur les points et que la typo est respectée (un point est toujours suivis d'un espace donc explode va prendre ce qui suis le point pour le début de la chaîne et la tu auras un premier "mot" "vide").


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

29 avr. 2014, 16:11

@moogli en particulier:
Tu as raison; c'est pourquoi je me sers de trim pour éviter le problème du mot vide en début de phrase.
et je pense qu'il vaudrait mieux, soit faire comme tu dis, soit se servir de strtok qui permetttrait d'isoler les mots avec l'espace et les ponstuations autres que le point. Je me demande même s'il ne faudrait pas strtok le texte entier (avec . ! ? comme séparateur)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD