Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/09/2008, 12h56   #1
Invité régulier
 
Avatar de yanchasp
 
Inscription : décembre 2005
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 66
Points : 9
Points : 9
Par défaut Comparaison chaine exacte

J'ai fait un test, ca marche bien sauf quand j'ai un mot clé qui compose d'autres mots clé.
J'ai utilisé "ireplace" pour la casse.

Voici mon test
Code :
1
2
3
4
5
$keywords = array("procede", "le", "Septieme art", "cinema");
$NewKeywords = array("<b>procede</b>", "<b>le</b>", "<b><u>Septieme art</u></b>", "<b>cinema</b>");
$Definition = "[abreviation de cinematographe] Procede qui permet d'enregistrer et de projeter sur un ecran des photographies animees. Septieme art. Salle ou l'on projette des films.";
 
echo $LaDefinition = str_ireplace($keywords, $NewKeywords, $Definition);
et voici ce que j'obtiens
Citation:
[abreviation de cinematographe] procede qui permet d'enregistrer et de projeter sur un ecran des photographies animees. Septieme art. Salle ou l'on projette des films.
Par exemple pour le mot cle "le", il me le trouve dans "salle" et je ne veux surtout pas. (idem pour "cinema")
J'ai donc essayé de mettre $keywords = array(" procede ", " le ");
Mais ce n'est pas bon, car il peut y avoir des points, virgule etc.... mais pas de lettres par contre.

Donc je pensais peut etre interdire autour les caracteres ascii des lettres et pas les exclamations et blancs.

Avez vous une idée?

Merci d'avance.
yanchasp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2008, 13h27   #2
Membre du Club
 
Développeur informatique
Inscription : février 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2007
Messages : 70
Points : 61
Points : 61
Envoyer un message via MSN à f.lam
As tu tenter la fonction tout simple str_replace ?
f.lam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2008, 13h35   #3
Invité régulier
 
Avatar de yanchasp
 
Inscription : décembre 2005
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 66
Points : 9
Points : 9
Citation:
Envoyé par f.lam Voir le message
As tu tenter la fonction tout simple str_replace ?
oui ca ne change rien.
J'utilise ireplace pour que ca fonctionne quand j'ai par exemple. "Test" et "test".
yanchasp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2008, 13h39   #4
Membre du Club
 
Développeur informatique
Inscription : février 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2007
Messages : 70
Points : 61
Points : 61
Envoyer un message via MSN à f.lam
Tu fais un explode de ta chaine par le caractere espace :

Code :
 $data = explode ("",$chaine);
tu boucles sur $data et remplaces tes occurences quand c'est necessaire

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
 
$string = '';
foreach ( $data as $key => $value )
{
   if ( in_array($value,$keywords)) 
       $string .= '<b>'.$value.'</b>';
   else
       $string .= $value ;
}
 
echo $string ;
Pour l'exception <u> souligné, tu peux faire un tableau de keywords de mots gras, un tableau de keywords de mot soulignés ...
f.lam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2008, 13h43   #5
Invité régulier
 
Avatar de yanchasp
 
Inscription : décembre 2005
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 66
Points : 9
Points : 9
Citation:
Envoyé par f.lam Voir le message
Tu fais un explode de ta chaine par le caractere espace :

Code :
 $data = explode ("",$chaine);
tu boucles sur $data et remplaces tes occurences quand c'est necessaire

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
 
$string = '';
foreach ( $data as $key => $value )
{
   if ( in_array($value,$keywords)) 
       $string .= '<b>'.$value.'</b>';
   else
       $string .= $value ;
}
 
echo $string ;
Pour l'exception <u> souligné, tu peux faire un tableau de keywords de mots gras, un tableau de keywords de mot soulignés ...
Merci, par contre cela ne fonctionnera pas pour des expressions cles (pour les mots oui).
Par exemple "septieme art" sera décomposé en "septieme" puis "art" non?
Car dans ma base de mot clés il y a aussi des expressions clés.
yanchasp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2008, 13h47   #6
Membre du Club
 
Développeur informatique
Inscription : février 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2007
Messages : 70
Points : 61
Points : 61
Envoyer un message via MSN à f.lam
Disons que la, les 2 mots seront bien en gras si "septieme" et "art" sont deux valeurs différentes du tableau $keywords, et c'est apparement le but, par contre, l'etat souligné va mettre 2 mots soulignés separement.
f.lam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2008, 15h01   #7
Modérateur
 
Avatar de Rakken
 
Inscription : août 2006
Messages : 1 208
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 208
Points : 1 138
Points : 1 138
Après, il y a toujours la solution de faire le parsing à la main.

Tu parcours ton texte, à la premiere lettre, tu regardes si elle correspond à un mot (ou plusieurs) de ton tableau, si c'est le cas, tu poses un marqueur, et tu fais défiler en parallèle les lettres du mot de ton tableau et du texte. S'il y a différence, tu retourne au marqueur et tu testes avec le mot suivant du tableau (s'il y a lieu), si aucun mot dans le tableau ne correspond, tu recommence le parcours de ton texte à l'emplacement "marqueur".
Dans la mesure où tu ne veux pas prendre les mots à l'interieur d'autres mots, tu itères jusqu'à tomber sur un caractère qui n'est pas une lettre (attention à la gestion des accents, ce sont bien des lettres), puis, à la premiere lettre suivant le caractère qui n'est pas une lettre, tu recommences la comparaison avec ton tableau.
Dans le cas où tu arrives à finir un mot de ton tableau, tu sais quand débute le mot (tu as mis un marqueur), tu sais quand il finit (genre, tu es précisement dessus), tu n'as donc plus qu'a remplacer la chaine par la même en souligné, et voila.
Ca te permet d'avoir "Septieme art" en un seul soulignement, mais c'est un peu plus galère à coder que les solutions d'au dessus. Mais en découpant bien en petites fonctions, ca doit pouvoir se faire relativement vite.
__________________
Rakken

Oneira, un monde imaginaire d'Heroic Fantasy.

Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/
Rakken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 15h32   #8
Invité régulier
 
Avatar de yanchasp
 
Inscription : décembre 2005
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 66
Points : 9
Points : 9
Citation:
Envoyé par Rakken Voir le message
Après, il y a toujours la solution de faire le parsing à la main.

Tu parcours ton texte, à la premiere lettre, tu regardes si elle correspond à un mot (ou plusieurs) de ton tableau, si c'est le cas, tu poses un marqueur, et tu fais défiler en parallèle les lettres du mot de ton tableau et du texte. S'il y a différence, tu retourne au marqueur et tu testes avec le mot suivant du tableau (s'il y a lieu), si aucun mot dans le tableau ne correspond, tu recommence le parcours de ton texte à l'emplacement "marqueur".
Dans la mesure où tu ne veux pas prendre les mots à l'interieur d'autres mots, tu itères jusqu'à tomber sur un caractère qui n'est pas une lettre (attention à la gestion des accents, ce sont bien des lettres), puis, à la premiere lettre suivant le caractère qui n'est pas une lettre, tu recommences la comparaison avec ton tableau.
Dans le cas où tu arrives à finir un mot de ton tableau, tu sais quand débute le mot (tu as mis un marqueur), tu sais quand il finit (genre, tu es précisement dessus), tu n'as donc plus qu'a remplacer la chaine par la même en souligné, et voila.
Ca te permet d'avoir "Septieme art" en un seul soulignement, mais c'est un peu plus galère à coder que les solutions d'au dessus. Mais en découpant bien en petites fonctions, ca doit pouvoir se faire relativement vite.
Oui se serait plus ca qu'il me faudrait.... mais oulala c chaud quand meme!
je vais essayer ca, mais c'est pas gagner...lol
Merci de ta réponse

MAJ: si quelqu'un veut bien me donner un coup de main pour se parsing se serait cool...lol... je suis un peu perdu quand meme.
yanchasp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 16h03   #9
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
Bonjour,

Il reste encore les fonctionnalités des expressions régulières

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
$keywords = array("procede", "le", "Septieme art", "cinema");
$NewKeywords = array("<b>procede</b>", "<b>le</b>", "<b><u>Septieme art</u></b>", "<b>cinema</b>");
$Definition = "[abreviation de cinematographe] Procede qui permet d'enregistrer et de projeter sur un ecran des photographies animees. Septieme art. Salle ou l'on projette des films.";
 
// Mise en forme des mots clés pour limiter le remplacement aux mots
$regex = array_map(
    create_function(
        '$keyword',
        'return "#\b".$keyword."\b#Ui";'
        ),
    $keywords);
 
echo $LaDefinition = preg_replace($regex, $NewKeywords, $Definition);
Pour l'expression régulière : \b vérifie qu'il s'agit d'une limite de mot, # sont les délimiteurs de la regex, et U et i sont des modificateurs (U pour 'non gourmande' et i pour 'insensible à la casse').
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 16h36   #10
Invité régulier
 
Avatar de yanchasp
 
Inscription : décembre 2005
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 66
Points : 9
Points : 9
Citation:
Envoyé par Eusebe Voir le message
Bonjour,

Il reste encore les fonctionnalités des expressions régulières

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
$keywords = array("procede", "le", "Septieme art", "cinema");
$NewKeywords = array("<b>procede</b>", "<b>le</b>", "<b><u>Septieme art</u></b>", "<b>cinema</b>");
$Definition = "[abreviation de cinematographe] Procede qui permet d'enregistrer et de projeter sur un ecran des photographies animees. Septieme art. Salle ou l'on projette des films.";
 
// Mise en forme des mots clés pour limiter le remplacement aux mots
$regex = array_map(
    create_function(
        '$keyword',
        'return "#\b".$keyword."\b#Ui";'
        ),
    $keywords);
 
echo $LaDefinition = preg_replace($regex, $NewKeywords, $Definition);
Pour l'expression régulière : \b vérifie qu'il s'agit d'une limite de mot, # sont les délimiteurs de la regex, et U et i sont des modificateurs (U pour 'non gourmande' et i pour 'insensible à la casse').
Génial, je viens de tester et ca à l'air nikel.
En plus ca régle également mon deuxième problème on dirait, pour les définitions des mots clés, je vais tester et je te tiens au courant.

PS: qu'est ce que tu entends par "non gourmande"?
__________________
Mes créations de montages photos et vidéos sur mon blog:
http://yanchasp.blogspot.com/
yanchasp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 16h48   #11
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
Citation:
Envoyé par yanchasp Voir le message
PS: qu'est ce que tu entends par "non gourmande"?
Voir le tuto sur les expressions régulières :
http://g-rossolini.developpez.com/tu...ns-regulieres/

et plus précisément pour les modificateurs :
http://g-rossolini.developpez.com/tu...e=page_2#LII-7

Citation:
Cela signifie que l'expression trouvera des résultats aussi petits que possible.
En fait, pour ton cas, c'est un modificateur qui ne présente aucun intérêt, mais c'est juste par habitude
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 17h07   #12
Invité régulier
 
Avatar de yanchasp
 
Inscription : décembre 2005
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 66
Points : 9
Points : 9
J'ai tester avec mes defs de mots clés, mais j'ai encore un petit soucis.
Je le post si jamais tu vois quelques chose.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
require('ConnectBD.php');
$query2 = 'SELECT nom,formule FROM keyword';
$result2 = mysql_query($query2);
$row2 = mysql_fetch_assoc($result2); 
while ($row2 = mysql_fetch_assoc($result2)){
	$NewKeywords[]= '<b><i>'.$row2['nom'].'</i></b> ('.$row2['formule'].'';
	$keywords[]=$row2['nom'];
}
 
 
// Mise en forme des mots clés pour limiter le remplacement aux mots
// Pour l'expression régulière : \b vérifie qu'il s'agit d'une limite de mot, # sont les délimiteurs de la regex, et U et i sont des modificateurs (U pour 'non gourmande' et i pour 'insensible à la casse').
$regex = array_map(
    create_function(
        '$keyword',
        'return "#\b".$keyword."\b#Ui";'
        ),
    $keywords);
 
echo $LaDefinition = preg_replace($regex, $NewKeywords, $row['texte']);
voila, en fait en meme temps que changer l'aspect du mot je veux récupérer la def de ce mot. Pour le test je fais juste un affiche dans la def générale, mais après je le mettrais un lien info bulle avec cette def pour quand on fait un survol de souris.

Ca marche nikel, quand dans la définition il n'y a aucun mot clé présent dans la base.
Mais si il y a un mot clé --> ben ca enchaine sur une def, et ca embrouille tous.
En fait je ne veux pas détecter de mots clés, dans les defs des mots clés.

Je ne sais pas si je suis assez clair, mais j'espere que tu auras une solution.

Merci encore et je vais regarder tes liens
__________________
Mes créations de montages photos et vidéos sur mon blog:
http://yanchasp.blogspot.com/
yanchasp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 17h50   #13
Invité régulier
 
Avatar de yanchasp
 
Inscription : décembre 2005
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 66
Points : 9
Points : 9
Ca y est ca marche!!! j'ai trouvé.

Par contre encore une tite question.

J'ai un soucis quand j'ai un mot qui peut former plusieurs mots clés.
Par exemple, j'ai comme mots cles dans ma base:
- marge
- marge brut
- marge net

Si dans un texte j'ai " pour calculer la marge net...." il va me mettre en mots clés "marge" au lieu de "marge net".

Sinon le reste nikel, tu m'as vachement aidé
__________________
Mes créations de montages photos et vidéos sur mon blog:
http://yanchasp.blogspot.com/
yanchasp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 19h22   #14
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
Pour le problème des mots clés contenus dans d'autres, c'est plus difficile...

Tu pourrais commencer par remplacer marge (par exemple par <b>marge</b>) puis rechercher le remplacement de marge + brute ou nette (donc "<b>marge</b> brute").

Mais pour ça il faut séparer les mots clés non inclus des autres...
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 12h00   #15
Modérateur
 
Avatar de Rakken
 
Inscription : août 2006
Messages : 1 208
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 208
Points : 1 138
Points : 1 138
Citation:
Pour le problème des mots clés contenus dans d'autres, c'est plus difficile...
Il y a une astuce. Il faut trier les mots clefs par ordre de taille. Et ne pas reprendre un mot (ou une portion de mot) qui a déjà été taggé.
__________________
Rakken

Oneira, un monde imaginaire d'Heroic Fantasy.

Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/
Rakken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 12h59   #16
Invité régulier
 
Avatar de yanchasp
 
Inscription : décembre 2005
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 66
Points : 9
Points : 9
Citation:
Envoyé par Rakken Voir le message
Il y a une astuce. Il faut trier les mots clefs par ordre de taille. Et ne pas reprendre un mot (ou une portion de mot) qui a déjà été taggé.
Bonne idée pour le tri, mais je ne trouves pas de requetes SQL correspondante, est ce que tu en connais une ou dois je le faire en php pour le "tri par nombre de caractere plus grand vers plus petit".
__________________
Mes créations de montages photos et vidéos sur mon blog:
http://yanchasp.blogspot.com/
yanchasp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 13h45   #17
Expert Confirmé
 
Avatar de Eusebe
 
Inscription : mars 2006
Messages : 1 989
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : mars 2006
Messages : 1 989
Points : 3 606
Points : 3 606
Si tu es sous MySQL, tu peux trier en utilisant la fonction CHAR_LENGTH...
Eusebe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 14h20   #18
Invité régulier
 
Avatar de yanchasp
 
Inscription : décembre 2005
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 66
Points : 9
Points : 9
Citation:
Envoyé par Eusebe Voir le message
Si tu es sous MySQL, tu peux trier en utilisant la fonction CHAR_LENGTH...
Je viens d'essayer, mais une fois que je fais ca, ca ne sert plus a rien vu qu'il remplace tout.
Code :
$LaDefinition = preg_replace($regex, $NewKeywords, $row['texte']);
__________________
Mes créations de montages photos et vidéos sur mon blog:
http://yanchasp.blogspot.com/
yanchasp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 16h43   #19
Invité régulier
 
Avatar de yanchasp
 
Inscription : décembre 2005
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 66
Points : 9
Points : 9
C'est bon j'ai réussi.
J'ai en fait crée deux tableau:
un avec mot cles
un avec expressions cle (avec les blancs)

puis je remplace le texte avec les mots cles et ensuite je remplace le nouveau texte avec les expressions cles.

__________________
Mes créations de montages photos et vidéos sur mon blog:
http://yanchasp.blogspot.com/
yanchasp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h48.


 
 
 
 
Partenaires

Hébergement Web