Comparaison de chaine et repérage des modifications

Comparaison de chaine et repérage des modifications - PHP - Programmation

Marsh Posté le 24-07-2006 à 22:51:19    

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
Reply

Marsh Posté le 24-07-2006 à 22:51:19   

Reply

Marsh Posté le 25-07-2006 à 03:19:46    

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+
 

Reply

Marsh Posté le 25-07-2006 à 03:22:20    

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 ?

Reply

Marsh Posté le 25-07-2006 à 07:49:17    

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

Reply

Marsh Posté le 25-07-2006 à 09:24:12    

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!

Reply

Marsh Posté le 25-07-2006 à 10:24:32    

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().

Reply

Marsh Posté le 25-07-2006 à 11:25:53    

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.

Reply

Marsh Posté le 25-07-2006 à 11:52:00    

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
Reply

Marsh Posté le 25-07-2006 à 11:57:23    

à 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

Reply

Marsh Posté le 25-07-2006 à 11:58:54    

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

Reply

Marsh Posté le 25-07-2006 à 11:58:54   

Reply

Marsh Posté le 25-07-2006 à 12:11:45    

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

Reply

Marsh Posté le 26-07-2006 à 12:26:07    

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!

Reply

Marsh Posté le 26-07-2006 à 13:21:47    

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.

Reply

Marsh Posté le 26-07-2006 à 14:20:06    

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à.

Reply

Marsh Posté le 26-07-2006 à 14:30:45    

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
 

Reply

Marsh Posté le 26-07-2006 à 15:01:18    

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
Reply

Marsh Posté le 26-07-2006 à 15:30:35    

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

Reply

Marsh Posté le 26-07-2006 à 17:32:36    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed