Page 1 sur 2
Problème avec la lecture d'un fichier ligne par ligne
Posté : 28 déc. 2008, 18:46
par cyberlp
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 !!
Posté : 28 déc. 2008, 18:54
par Ryle
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 ?

Posté : 28 déc. 2008, 19:00
par cyberlp
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 ?

Posté : 28 déc. 2008, 19:06
par AB
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 ?
Posté : 28 déc. 2008, 19:13
par AB
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.
Posté : 28 déc. 2008, 19:18
par cyberlp
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 ?
Posté : 28 déc. 2008, 19:32
par blof
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() )
Posté : 28 déc. 2008, 19:33
par AB
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 ?
Posté : 28 déc. 2008, 19:42
par cyberlp
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

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.
Posté : 28 déc. 2008, 20:55
par blof
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 )
Posté : 28 déc. 2008, 21:16
par cyberlp
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.)
Posté : 28 déc. 2008, 21:37
par blof
$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
}
Posté : 28 déc. 2008, 21:50
par cyberlp
Merci beaucoup pour ton aide.
Posté : 28 déc. 2008, 22:12
par AB
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);
Posté : 29 déc. 2008, 09:33
par cyberlp
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")