Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3105 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Comparaison de chaine et repérage des modifications

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comparaison de chaine et repérage des modifications

n°1412681
dwogsi
Défaillance cérébrale...
Posté le 24-07-2006 à 22:51:19  profilanswer
 

Salut salut tout le monde!
Bon bon bon je vais essayer d'être clair (et peut être aussi arrêter d'écrire comme si je parlais).
 
Donc mon boss a encore eut une bonne idée... Comme toujours...
On a sur un site quelques textes modifiables via un backoffice. Alors ils veut que ces textes soient modifiables par lui (c'est fait, rien de compliqué) mais aussi par ses collaborateurs et que lui valide les modifs qu'ils appotent (rien de compliqué non-plus et c'est également fait).
 
Mais (il fallait bien un mais!) il voudrait que les modifs apparaissent clairement dans la version modifiées avant de valider celle-ci. Autrement dit si un collaborateur rajoute un paragraphe celui-ci doit apparaître sur un fond d'une couleur différente, et s'il supprime quelque chose on doit faire de même, etc...
 
Toute partie ainsi modifiée devrait donc être rapidement identifiable, histoire de ne pas avoir a contrôler tout le reste si ce n'est pas nécessaire.
 
L'ennui est que je ne me suis jamais vraiment attaché à ce genre de problèmes et que donc je connais pas quelle sont les méthodes pour comparer deux textes et repérer les modifications. Et très franchement je ne sas pas par où commencer...
 
C'est pourquoi je viens vous demander si vous ne sauriez pas où il y a de la documentation à ce propos?  
parce que toutes mes recherches sont restées vaines... Ou si quelqu'un peut m'expliquer le principe? La méthode?
 
Et je dois utiliser impérativement php (reduction de coût oblige...).
 
En vous remerciant.  :jap:

Message cité 1 fois
Message édité par dwogsi le 26-07-2006 à 12:48:21
mood
Publicité
Posté le 24-07-2006 à 22:51:19  profilanswer
 

n°1412748
supermofo
Hello World !
Posté le 25-07-2006 à 03:19:46  profilanswer
 

dwogsi a écrit :

Salut salut tout le monde!
Bon bon bon je vais essayer d'être clair (et peut être aussi arrêter d'écrire comme si je parlais).
 
Donc mon boss a encore eut une bonne idée... Comme toujours...
On a sur un site quelques textes modifiables via un backoffice. Alors ils veut que ces textes soient modifiables par lui (c'est fait, rien de compliqué) mais aussi par ses collaborateurs et que lui valide les modifs qu'ils appotent (rien de compliqué non-plus et c'est également fait).
 
Mais (il fallait bien un mais!) il voudrait que les modifs apparaissent clairement dans la version modifiées avant de valider celle-ci. Autrement dit si un collaborateur rajoute un paragraphe celui-ci doit apparaître sur un fond d'une couleur différente, et s'il supprime quelque chose on doit faire de même, etc...
 
Toute partie ainsi modifiée devrait donc être rapidement identifiable, histoire de ne pas avoir a contrôler tout le reste si ce n'est pas nécessaire.
 
L'ennui est que je ne me suis jamais vraiment attaché à ce genre de problèmes et que donc je connais pas quelle sont les méthodes pour comparer deux textes et repérer les modifications. Et très franchement je ne sas pas par où commencer...
 
C'est pourquoi je viens vous demander si vous ne sauriez pas où il y a de la documentation à ce propos?  
parce que toutes mes recherches sont restées vaines... Ou si quelqu'un peut m'expliquer le principe? La méthode?
 
Et je dois utiliser impérativement php (reduction de coût oblige...).
 
En vous remerciant.  :jap:


 
 
 
Si tu as un gestionnaire d'utilisateur tu devrais facilement t en sortir avec les fonctions de base de temps, les variables de sessions et tout le reste ...
Sinon tu devrais pouvoir récuperer des informations sur les fichiers via fileatime() filectime() file(). Pour savoir qui à fait une modification il te faut absolument une variable de longue durée ( cookie par exemple ).
 
Pour les outils rien de plus simple:
 
Pour utilisateur Boss => droit d acces, modif, effacer de toutes les docs et commentaires
Pour utilisateur Autres => droit d'acces, modif, effacer des docs qui lui appartienne.
 
 
Ya pleins de ressources sur le web, à commencer par le code d'un forum ou d'un CMS. N oublie pas de corriger les failles qui subsistent si tu copies colles du code !
 
a+
 

n°1412749
supermofo
Hello World !
Posté le 25-07-2006 à 03:22:20  profilanswer
 

Ah oui je rajoute en reponse à " pour comparer deux textes ... ".
 
Tout dépend de la taille de ton texte ! Mais encore une fois un UPDATE est un update donc une modification, c'est suffisant non ?

n°1412757
mIRROR
Chevreuillobolchévik
Posté le 25-07-2006 à 07:49:17  profilanswer
 

je crois que t as mal compris supermofo visiblement tout ca il l a deja fait
il cherche a mettre en evidence les modifications apportees a l article
je vois mal comment faire mais comme c est une feature interressante je plante mon drapal
dans l idee ca ne devrait pas etre trop difficile de commencer par trouver les caracteres qui collent exactement
j utilise beaucoup de trucs a la strpos parce que les regex c est encore trop balaise pour moi fais comme tu le sens mieux quoi :/
genre tu geres caractere par caractere et des que ca colle plus tu fais un gros bloc de ce qui a collé
tu supprimes tout dans les blocs a comparer et a la fin il te reste plus que les differences entre les deux textes
ce qui restera du texte initial sera ce qui a été supprimé et ce qui restera du nouveau texte sera ce qui a été ajouté
je sais pas si j ai été clair mais dans ma tete ca semble logique :D

n°1412786
anapajari
s/travail/glanding on hfr/gs;
Posté le 25-07-2006 à 09:24:12  profilanswer
 

tes "articles", ils sont stockés dans des fichiers ou dans une base?
 
En tout cas une méthode assez simple pour comparer 2 longs textes ( en gros c'est l'équivalent du diff de linux si tu connais).
- Tu splittes tes textes dans un tableau sur les retour à la ligne
- tu fais un array_diff entre ces deux tableaux
ça marche très bien mais c'est un peu lambda... enfin rien ne t'empêche de rajouter des fioritures!

n°1412837
dwogsi
Défaillance cérébrale...
Posté le 25-07-2006 à 10:24:32  profilanswer
 

Merci pour vos réponses. Alors :

supermofo a écrit :

Ah oui je rajoute en reponse à " pour comparer deux textes ... ".
 
Tout dépend de la taille de ton texte ! Mais encore une fois un UPDATE est un update donc une modification, c'est suffisant non ?


Oui ça c'est fait! Et c'est suffisant à mes yeux mais le boss c'est le boss...

mIRROR a écrit :

je crois que t as mal compris supermofo visiblement tout ca il l a deja fait
il cherche a mettre en evidence les modifications apportees a l article
je vois mal comment faire mais comme c est une feature interressante je plante mon drapal
dans l idee ca ne devrait pas etre trop difficile de commencer par trouver les caracteres qui collent exactement
j utilise beaucoup de trucs a la strpos parce que les regex c est encore trop balaise pour moi fais comme tu le sens mieux quoi :/
genre tu geres caractere par caractere et des que ca colle plus tu fais un gros bloc de ce qui a collé
tu supprimes tout dans les blocs a comparer et a la fin il te reste plus que les differences entre les deux textes
ce qui restera du texte initial sera ce qui a été supprimé et ce qui restera du nouveau texte sera ce qui a été ajouté
je sais pas si j ai été clair mais dans ma tete ca semble logique :D


Voilà c'est bien ça que je cherche à faire mais je me suis dit dès le départ qu'un traitement caractère par caractère n'était pas la bonne solution.

anapajari a écrit :

tes "articles", ils sont stockés dans des fichiers ou dans une base?
 
En tout cas une méthode assez simple pour comparer 2 longs textes ( en gros c'est l'équivalent du diff de linux si tu connais).
- Tu splittes tes textes dans un tableau sur les retour à la ligne
- tu fais un array_diff entre ces deux tableaux
ça marche très bien mais c'est un peu lambda... enfin rien ne t'empêche de rajouter des fioritures!


Et justement c'est ce à quoi j'ai pensé cette nuit (comme quoi la nuit porte effectivement conseil).
Les textes à modifier sont stockés en BDD.
 
Je vais donc voir comment je peux interpreter ce que retoune le array_diff().

n°1412897
dwogsi
Défaillance cérébrale...
Posté le 25-07-2006 à 11:25:53  profilanswer
 

Mais c'est que ça a l'air de bien fonctionner!
 
Bon alors avec array_diff() j'arrive a faire que les ajout apparaissent sur fond vert, les paragraphes supprimmés apparaissent sur fond rouge.
 
Et un paragraphe modifié se traduit par une succession de deux paragraphes l'un vert qui est la version modifiée du suivant qui apparait en rouge et qui est donc la version modifiée.
 
Donc c'est a peu prêt ce que je voulais. Je vais quand même essayer d'améliorer ça.

n°1412927
dwogsi
Défaillance cérébrale...
Posté le 25-07-2006 à 11:52:00  profilanswer
 

Testable ici : .../perso/forums/modif/test.php
Faites pas attention au code html c'est vraiment du vite fait!
Z'en dites quoi?


Message édité par dwogsi le 26-07-2006 à 00:02:18
n°1412939
anapajari
s/travail/glanding on hfr/gs;
Posté le 25-07-2006 à 11:57:23  profilanswer
 

à améliorer ... ;)  
Suffit que je change une lettre pour que toute la ligne ressorte...
A mon avis il faut que tu fasses plus fin :D

n°1412942
dwogsi
Défaillance cérébrale...
Posté le 25-07-2006 à 11:58:54  profilanswer
 

Ouai mais plus fin ça devient vite lourd... Mais j'y travaille!

mood
Publicité
Posté le 25-07-2006 à 11:58:54  profilanswer
 

n°1412955
mIRROR
Chevreuillobolchévik
Posté le 25-07-2006 à 12:11:45  profilanswer
 

ok chui con j avais pas calculé que c etait ca array_diff :D
en plus je bosse a fond les tableaux en ce moment :/
y a udiff si tu veux appliquer une fonction de callback

n°1413748
dwogsi
Défaillance cérébrale...
Posté le 26-07-2006 à 12:26:07  profilanswer
 

Bon et bien cette fois-ci c'est sûr : je ne m'en sort pas...
 
Alors on va dire que ceci est un petit up! Parce que ce que je cherche c'est de la doc sur des méthodes de comparaisons de chaines (et ça doit bien exister) mais je ne trouve pas... (Et je ne cherche pas un simple == ca je sais faire)
 
Mon ami google me donne plein de choses mais rien qui m'aide! J'ai bien trouvé quelques sources en C++ qui donnent quelques pistes mais rien de suffisamment "évolué" à mon goût.
 
Enfin bon j'ais tout mon temps puisque mister boss est satisfait du repérage des modifs par bloques, même s'il n'y a eut qu'une lettre de changer donc on va dire que maintenant c'est plus à titre personnel et expérimental que je me penche la dessus. Et puis ça pourra toujours me servir pour la suite!

n°1413790
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-07-2006 à 13:21:47  profilanswer
 

bon déjà t'as des fonctions toutes faites en php qui sont bien pratiques:
- similar_text
- levenstrein
- voir même soundex
 
Donc en fonction de la similarité des chaines, tu peux très bien faire une comparaison mots à mots de celles-ci, et si c'est juste un mot qui est différent faire une comparaison lettre à lettre.

n°1413854
dwogsi
Défaillance cérébrale...
Posté le 26-07-2006 à 14:20:06  profilanswer
 

Les fonctions pour les chaînes je les connais pour en avoir lu la liste en entier. C'est plus la logique qui me manque un peu là.

n°1413866
mIRROR
Chevreuillobolchévik
Posté le 26-07-2006 à 14:30:45  profilanswer
 

bah je comprends pas
array diff te renvoie un tableau ok
chaque entree du tableau sera une phrase donc tu explodes avec un espace pour obtenir un tableau de mots
re array_diff
et la t as deja la précision au mot
suffit de recommencer si tu veux encore plus precis
 

n°1413907
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-07-2006 à 15:01:18  profilanswer
 

mIRROR a écrit :

bah je comprends pas
array diff te renvoie un tableau ok
chaque entree du tableau sera une phrase donc tu explodes avec un espace pour obtenir un tableau de mots
re array_diff
et la t as deja la précision au mot
suffit de recommencer si tu veux encore plus precis


Oui mais non :o
Regarde, texte avant:

Ils appartienne au groupe des Pulmonés : leur cavité palléale est transformé en poumon, dont le toit est richement vascularisé et dont le plancher accolé au pied est musculeux et permet la ventilation.
 
Ils ont une coquille hélicoïdale globuleuse, et 2 paires de cornes rétractiles, une munie d'« yeux », une autre tactile.


Après

Les escargots
 Ils appartiennent au groupe des Pulmonés : leur cavité palléale est transformée en poumon, dont le toit est richement vascularisé et dont le plancher accolé au pied est musculeux et permet la ventilation.
 
 Ils ont une coquille hélicoïdale globuleuse, et deux paires de cornes rétractiles, une munie d'« yeux », une autre tactile.


Et ton array_diff de 2(le nouveau) sur 1(l'ancien) te donne:


Array
(
    [0] => Les escargots
    [1] =>  Ils appartiennent au groupe des Pulmonés : leur cavité palléale est transformée en poumon, dont le toit est richement vascularisé et dont le plancher accolé au pied est musculeux et permet la ventilation.
    [3] =>  Ils ont une coquille hélicoïdale globuleuse, et deux paires de cornes rétractiles, une munie d'« yeux », une autre tactile.
)


Tu as donc identifié trois lignes que ton nouveau fichier qui n'existent pas dans le premier ( absente OU différente).
Bon maintenant avant de faire ton array_diff sur les mots, comment tu fais pour trouver a quelle ligne elles correspondaient dans le fichier original (si cette ligne existe)?


Message édité par anapajari le 26-07-2006 à 15:02:10
n°1413929
mIRROR
Chevreuillobolchévik
Posté le 26-07-2006 à 15:30:35  profilanswer
 

atta je teste aujourd hui je dis que de la merde :sweat:

n°1414032
mIRROR
Chevreuillobolchévik
Posté le 26-07-2006 à 17:32:36  profilanswer
 

bon jusque la j ai reussi a sortir  
 

Code :
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => Les
  6.             [1] => escargots
  7.         )
  8.     [1] => Array
  9.         (
  10.             [0] => Les
  11.             [1] => escargots
  12.         )
  13.     [2] => Array
  14.         (
  15.             [0] =>
  16.             [2] => appartiennent
  17.             [12] => transformée
  18.         )
  19.     [3] => Array
  20.         (
  21.             [0] =>
  22.             [8] => deux
  23.         )
  24. )


 
donc je suis pas trop loin
y a juste ce doublon sur les escargots que je comprend pas des masses :/
 
edit :
tant qu'à faire je fous mon code aussi
 

Code :
  1. $string1 = "Les escargots
  2. Ils appartiennent au groupe des Pulmonés : leur cavité palléale est transformée en poumon, dont le toit est richement vascularisé et dont le plancher accolé au pied est musculeux et permet la ventilation.
  3. Ils ont une coquille hélicoïdale globuleuse, et deux paires de cornes rétractiles, une munie d'« yeux », une autre tactile.";
  4. $string2 = "Ils appartienne au groupe des Pulmonés : leur cavité palléale est transformé en poumon, dont le toit est richement vascularisé et dont le plancher accolé au pied est musculeux et permet la ventilation.
  5. Ils ont une coquille hélicoïdale globuleuse, et 2 paires de cornes rétractiles, une munie d'« yeux », une autre tactile.";
  6. $array1 = explode("\r\n",$string1);
  7. $array2 = explode("\r\n",$string2);
  8. $array3 = array_diff($array1,$array2);
  9. $array4 = array_diff($array2,$array1);
  10. print_r($array3);
  11. print_r($array4);
  12. foreach($array3 as $key3=>$val3) :
  13.  if(!isset($val3)) $val3 = '';
  14.  foreach($array4 as $key4=>$val4) :
  15.   if(!isset($val4)) $val4 = '';
  16.   $similarText = ((similar_text($val3,$val4))/(max(strlen($val3),strlen($val4)))*100);
  17.   if ( ($similarText > 90) || ($similarText < 10) ) :
  18.    $newArray1 = explode(' ',$val3);
  19.    $newArray2 = explode(' ',$val4);
  20.    $newArrayDiff[] = array_diff($newArray1,$newArray2);
  21.    endif;
  22.   endforeach;
  23.  endforeach;
  24. print_r($newArrayDiff);


Message édité par mIRROR le 26-07-2006 à 17:35:49

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Comparaison de chaine et repérage des modifications

 

Sujets relatifs
decouper une chaine de caractères en motsSupprimer des caractères spéciaux d'une chaine
Couper une chaine de caractère[Perl] générer une variable grace à une chaine
[resolu] [batch] recherche chaine avec findstr[VBA] RESOLU Extraction d'une chaine de caractères
Contours actifs, repérage cercle[VBS] : comparaison de fichiers (ligne par ligne)
Insertion SQL, comparaison de variable avec fichier .txt[Batch] Que pensez vous de mes modifications de XP
Plus de sujets relatifs à : Comparaison de chaine et repérage des modifications


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR