Comparaison de texte

Comparaison de texte - PHP - Programmation

Marsh Posté le 15-06-2009 à 17:51:17    

Bonjour,
 
J'ai besoin de l'avis des programmeurs que vous êtes.
 
Contexte : j'ai un site, où les membres peuvent poster puis modifier leurs commentaires.
But du jeu : pouvoir tracer les modifications faites sur un texte afin de voir rapidement ce qui a été modifié.
Langage utilisé : PHP + mySql
 
J'ai trouvé Text_Diff de PEAR.
L'avez vous déjà utilisé ? Je ne comprends pas trop le principe, ni comment l'utiliser. Les exemples donnés sont trop simples : ils ne montrent que comment afficher à l'écran la différence entre deux textes, mais pas comment sauvegarder un patch, ni comment appliquer un patch sur un texte pour revenir à la version précédente.
 
La fonction unix diff, sert à générer un patch que l'on peu ensuite appliquer à un texte pour remonter à la version précédente, non ?
 
Afin de limiter au maximum la taille de ma base de donnée, je comptais stocker : le texte final dans une table pour l'affichage et dans une autre les patchs diff successifs permetant de revenir à la version précédente si besoin.
 
Que pensez vous de ma solution ? Auriez vous des conseils ou des exemples d'utilisation ?
 
Merci d'avance
 
Flu


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 15-06-2009 à 17:51:17   

Reply

Marsh Posté le 25-06-2009 à 16:20:31    

pas d'idée ?
personne n'a jamais fait ce genre de chose en PHP ?
 
Quel est le pendant de Text_Diff pour appliquer un patch sur une chaine ?


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 25-06-2009 à 17:06:38    

J'ai déja utilisé Pear pour faire de l'authentification ainsi que des requettes pseudos-préparés mais jamais text_diff :o


---------------
http://petitjonas.blogspot.com/
Reply

Marsh Posté le 25-06-2009 à 20:10:43    

Domage !
 
Text_Diff a en plus la facheuse tendance de ne pas respecter les standards php5 et leve des erreurs de codage. Donc pas moyen de l'utiliser tel quel si on a mis l'option E_ALL.
 
Il faut modifier les "&new UneClasse" par "new UneClasse" dans tous les fichiers de la librairie Text_Diff.
 
Pour le "patch", j'ai du recoder une fonction maison a partir du format rendu par Text_Diff :
 

Code :
  1. //appel de diff pour obtenir un $patch
  2. function diff($original, $final) {
  3. $diff = new Text_Diff(split("\n",str_replace( "\r\n", "\n",$original)), split("\n",str_replace( "\r\n", "\n",$final)));
  4. $renderer = new Text_Diff_Renderer();
  5. return $renderer->render($diff);
  6. }


 

Code :
  1. //application d'un patch sur un text
  2. function patch($original, $patch) {
  3. $new = array();
  4. $current = 0;
  5. $original_array = explode( "\n", str_replace( "\r\n", "\n", $original ) );
  6. $patch_array    = explode( "\n", $patch );
  7. $countOriginal = count($original_array);
  8. foreach($patch_array as $line ) {
  9.  if (!empty($line)) {
  10.   if ($line[0] == '>') { //add
  11.    $new[] =  substr( $line, 2 );
  12.   } else if (preg_match("/^([0-9]+)(?:,([0-9]+))?(a|d|c)/", $line, $matches)) {
  13.    $l_start = $matches[1] - 1;
  14.    $l_end   = $matches[2] != "" ? $matches[2] - 1 : $l_start;
  15.    $action  = $matches[3];
  16.    for(; $current < $l_start; $current++) {
  17.     $new[] = $original_array[$current];
  18.    }
  19.    if ($action == "d" ) {
  20.     $current = $l_end + 1;
  21.    } else if ($action == "a" ) {
  22.     $new[] = $original_array[$current++];
  23.    } else if ($action == "c" ) {
  24.     $current += $l_end - $l_start + 1;
  25.    }
  26.   }
  27.  }
  28. }
  29. for(; $current < $countOriginal; $current++) {
  30.  $new[] = $original_array[$current];
  31. }
  32. return implode( "\n", $new );
  33. }


 
Mais bon reinventer la roue n'est pas forcement une bonne solution. Si il existait une librairie robuste et testée par un plus grand nombre, ça m'aurait pas deplus.


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Sujets relatifs:

Leave a Replay

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