Problème avec la lecture d'un fichier ligne par ligne

Eléphanteau du PHP | 31 Messages

28 déc. 2008, 18:46

Bonjour,

J'ai un fichier lexique.php qui contient une liste de mots (1 mot par ligne).

J'ai un texte cible placé dans une variable $textes.

Mon objectif est de supprimer toutes les occurrences des différents mots de la liste dans la variable $textes.

J'ai donc le code suivant, mais cela ne marche pas.
$lexique=file("lexique.php");

for ($i=0; $i<count($lexique); $i++) {
$textes=eregi_replace($lexique[$i]," ",$textes);

}
echo $textes;

En revanche si je remplace $lexique[$i] directement par un de mots de la liste, le remplacement se fait comme prévu.

Ensuite, j'aimerais placer le contenu de la nouvelle variable $textes, à l'inverse, dans un nouveau fichier, en plaçant 1 mot par ligne, afin de pouvoir étudier les occurrences. Quelle serait selon vous la meilleure méthode ?

Merci beaucoup pour votre aide !!

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

28 déc. 2008, 18:54

Et avec un foreach() a la place du for() ?
$lexique=file("lexique.php"); 
foreach ($lexique as $mot) { 
  $textes=eregi_replace($mot," ",$textes); 
} 
echo $textes;
Ps : cyberlp == kubby, ou c'est juste une coïncidence de pseudo ? :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 31 Messages

28 déc. 2008, 19:00

Non, ça ne marche toujours pas.

Mais bizarrement, si je mets l'un des mots à la place de $mot, par exemple :
$textes=eregi_replace("mot"," ",$textes);
il effectue bien le remplacement.



PS : ça dépend, est-ce que Ryle = le Chevalier Blanc ? :idea:

ViPHP
AB
ViPHP | 5818 Messages

28 déc. 2008, 19:06

Fais un print_r($lexique) pour comprendre à quoi correspond $lexique[$i].

Par ailleurs est-tu certain qu'il est nécessaire d'utiliser eregi_replace pour supprimer un élément d'un tableau ?

ViPHP
AB
ViPHP | 5818 Messages

28 déc. 2008, 19:13

Ha oui je n'avais pas vu ta dernière question.

A priori, j'enregistrerais mes mots dans un tableau sérialisé plutôt que de faire un mot par ligne, c'est plus facile à manipuler.

Eléphanteau du PHP | 31 Messages

28 déc. 2008, 19:18

L'idée en fait est de supprimer tous les articles (notamment) d'un texte.

Que "Le petit chien mange la pomme" devienne "petit chien mange pomme".

Peut-être y a-t-il une meilleure méthode ??



PS : Pour le tableau sérialisé, comment tu le constitues à partir du fichier lexique ?

Eléphant du PHP | 170 Messages

28 déc. 2008, 19:32

Salut,

$lexique[$i] issu d'un file() contient un "retour à la ligne" ( \r\n chez windows, \n chez linux, \r chez mac ).

Dans ton $textes il n'y a pas ces "retours à la ligne".

Je n'ai pas essayé, mais je verrais bien un :
$textes=eregi_replace(chop($lexique[$i])," ",$textes);
( il existe aussi str_ireplace() préférable à eregi_replace() )

ViPHP
AB
ViPHP | 5818 Messages

28 déc. 2008, 19:33

Hum... j'avais pas bien compris ce que tu souhaites faire. Si maintenant j'ai bien compris tu as une liste de mots dans un fichier, et tu veux supprimer dans un texte tous les mots inclus dans ce fichier ?

Eléphanteau du PHP | 31 Messages

28 déc. 2008, 19:42

Hum... j'avais pas bien compris ce que tu souhaites faire. Si maintenant j'ai bien compris tu as une liste de mots dans un fichier, et tu veux supprimer dans un texte tous les mots inclus dans ce fichier ?
Oui c'est bien cela.

Et blof a trouvé ce qui clochait :D Maintenant ça marche parfaitement avec le chop(). (merci beaucoup !!)

En ce qui concerne ma 2e question, que conseilleriez-vous ? (Je rappelle que l'idée est d'analyser le texte obtenu en virant certains mots afin d'établir des analyses d'occurrence : genre un classement des mots qui apparaissent le plus.

Eléphant du PHP | 170 Messages

28 déc. 2008, 20:55

Que "Le petit chien mange la pomme" devienne "petit chien mange pomme".
mais si le texte est "Le petit chien mange la belle pomme"
il devient "petit chien mange bel pomme"

pour eviter ça il vaudrait mieux :
$textes = preg_replace('/\b'.chop($lexique[$i]).'\b/i', '', $textes);
Pour la 2ème question, par exemple :
<pre>
<?php
$txt = '
Il était un grand mur blanc - nu, nu, nu,
Contre le mur une échelle - haute, haute, haute,
Et, par terre, un hareng saur - sec, sec, sec.
';
// Charles Cros (Le hareng saur - extrait)

$txt = strtolower($txt);
preg_match_all('/\w+/', $txt, $v);

$nb_mot = array_count_values($v[0]);
arsort($nb_mot);
print_r($nb_mot);
?>
</pre>

On peut aussi enlever les mots à ce niveau par un unset(), par exemple : unset($nb_mot['bbb']);
( à voir )
Modifié en dernier par blof le 28 déc. 2008, 21:19, modifié 1 fois.

Eléphanteau du PHP | 31 Messages

28 déc. 2008, 21:16

Ok merci c'est effectivement tout à fait cela que je cherche !

Et comment afficher dans ce cas le contenu de l'array ? (par exemple les 10 premières occurrences par ordre décroissan : "mot 1 : 4 occurrences, mot 2 : 3 occurrences", etc.)

Eléphant du PHP | 170 Messages

28 déc. 2008, 21:37

$nb_occurrences = 10;

$nb_mot = array_slice($nb_mot, 0, $nb_occurrences);

foreach($nb_mot as $mot => $occurrences)
{
	// tout ce que tu veux faire avec $mot et $occurrences
}

Eléphanteau du PHP | 31 Messages

28 déc. 2008, 21:50

Merci beaucoup pour ton aide.

ViPHP
AB
ViPHP | 5818 Messages

28 déc. 2008, 22:12

Attention toutefois, les regex ci-dessus ne fonctionneront pas correctement pour un encodage en utf-8
cf : http://www.phpwact.org/php/i18n/utf-8

Pour un encodage en utf-8 on pourrait éventuellement faire
$txt = mb_strtolower($txt,"utf-8");
preg_match_all('/[\w]+/u', $txt, $v);

Eléphanteau du PHP | 31 Messages

29 déc. 2008, 09:33

D'accord.

J'ai 2 petites questions subsidaires :

- Avant j'utilisais eregi_replace, car majuscules/minuscules n'avaient pas d'importance. Comment retrouver l'équivalent avec la nouvelle formulation?

- Ensuite, AB, ta proposition en UTF-8 signifie-t-elle que par exemple "écran" et "ecran" seront équivalents ? Et si non, comment le signifier ? (la liste d'occurrence finale ne doit pas distinguer "écran" de "ecran")