begin process at 2012 05 27 18:31:14
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichier / Disque

 > SIMPLE DIFF ENTRE 2 FICHIERS

SIMPLE DIFF ENTRE 2 FICHIERS


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichier / Disque Classé sous :diff, fichiers, chaînes, differences, modifications Niveau :Débutant Date de création :22/06/2006 Vu / téléchargé :5 734 / 151

Auteur : malalam

Ecrire un message privé
Site perso
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 Description

Ceci est une simple fonction qui fait un diff sur 2 fichiers de type texte (texte = texte, php, html...enfin, tout sauf du binaire quoi).
Elle est sommaire, mais elle peut servir je pense. C'est juste un début sommaire pour un plus gros projet (un CVS en php, en fait). Je ne comptais pas la poster ici, mais finalement...je me dis qu'en l'état, elle doit pouvoir être utile à certains.

Source

  • <?php
  • /**
  • * function fileDiff ()
  • * checks differences between 2 files : additions, suppressions and modifications
  • * @Param (string) sFileOriginal : the original filename
  • * @Param (string) sFileModified : the modified filename
  • * @Return (mixed) : false (boolean) if failed, (array) aDiff with differences if succeeded
  • */
  • function fileDiff ($sFileOriginal, $sFileModified) {
  • /**
  • * checks that the files are accessible. If not, exit.
  • */
  • if (!file_exists ($sFileOriginal) || !file_exists ($sFileModified)) {
  • return false;
  • }
  • /**
  • * gets the content of each file in an array, each entry being a line of the file
  • */
  • $aFirst = file ($sFileOriginal);
  • $aLast = file ($sFileModified);
  • /**
  • * gets the biggest value between the size of both the arrays
  • */
  • $iMax = max (count ($aFirst), count ($aLast));
  • /**
  • * creates a callback function to remove any \r\n\t or space at the end or the beginninh of the line
  • */
  • $myTrim = create_function ('$val', 'return trim ($val);');
  • /**
  • * removes the empty entries in both the arrays, without touching the indexes
  • */
  • $aFirst = array_filter (array_map ($myTrim, $aFirst));
  • $aLast = array_filter (array_map ($myTrim, $aLast));
  • /**
  • * declaration of the aDiff array
  • */
  • $aDiff = array ();
  • /**
  • * loops on both the arrays, to the end of the biggest one
  • */
  • for ($i = 0; $i < $iMax; $i++) {
  • if (isset ($aFirst[$i])) {
  • if (isset ($aLast[$i])) {
  • if ($aFirst[$i] !== $aLast[$i]) {
  • /**
  • * both entries exists and are different, so, it's a modification
  • */
  • $aDiff[$i]['MODIFIED'] = htmlentities ($aLast[$i]);
  • }
  • } else {
  • /**
  • * there is an original entry, but nothing in the modified file, so, it's a suppression
  • */
  • $aDiff[$i]['SUPPR'] = htmlentities ($aFirst[$i]);
  • }
  • } else {
  • if (isset ($aLast[$i])) {
  • /**
  • * there is a modified entry but no corresponding original entry, so, it's an addition
  • */
  • $aDiff[$i]['ADDED'] = htmlentities ($aLast[$i]);
  • }
  • }
  • }
  • return $aDiff;
  • }
  • $sFirst = 'test.php';
  • $sLast = 'test2.php';
  • $aDiff = fileDiff ($sFirst, $sLast);
  • foreach ($aDiff as $clef => $val) {
  • echo 'LIGNE ', $clef+1, ' : ';
  • switch (key ($val)) {
  • case 'MODIFIED' :
  • echo '<span style="color: #0000ff;">',$val['MODIFIED'],'</span><br />';
  • break;
  • case 'SUPPR' :
  • echo '<span style="color: #ff0000;">',$val['SUPPR'],'</span><br />';
  • break;
  • case 'ADDED' :
  • echo '<span style="color: #00ff00;">',$val['ADDED'],'</span><br />';
  • break;
  • }
  • }
  • ?>
<?php
/**
* function fileDiff ()
* checks differences between 2 files : additions, suppressions and modifications
* @Param (string) sFileOriginal : the original filename
* @Param (string) sFileModified : the modified filename
* @Return (mixed) : false (boolean) if failed, (array) aDiff with differences if succeeded
*/
function fileDiff ($sFileOriginal, $sFileModified) {
	/**
	* checks that the files are accessible. If not, exit.
	*/
	if (!file_exists ($sFileOriginal) || !file_exists ($sFileModified)) {
		return false;
	}
	/**
	* gets the content of each file in an array, each entry being a line of the file
	*/
	$aFirst = file ($sFileOriginal);
	$aLast = file ($sFileModified);
	/**
	* gets the biggest value between the size of both the arrays
	*/
	$iMax = max (count ($aFirst), count ($aLast));
	/**
	* creates a callback function to remove any \r\n\t or space at the end or the beginninh of the line
	*/
	$myTrim = create_function ('$val', 'return trim ($val);');
	/**
	* removes the empty entries in both the arrays, without touching the indexes
	*/
	$aFirst = array_filter (array_map ($myTrim, $aFirst));
	$aLast = array_filter (array_map ($myTrim, $aLast));
	/**
	* declaration of the aDiff array
	*/
	$aDiff = array ();
	/**
	* loops on both the arrays, to the end of the biggest one
	*/
	for ($i = 0; $i < $iMax; $i++) {
		if (isset ($aFirst[$i])) {
			if (isset ($aLast[$i])) {
				if ($aFirst[$i] !== $aLast[$i]) {
					/**
					* both entries exists and are different, so, it's a modification
					*/
					$aDiff[$i]['MODIFIED'] = htmlentities ($aLast[$i]);
				}
			} else {
				/**
				* there is an original entry, but nothing in the modified file, so, it's a suppression
				*/
				$aDiff[$i]['SUPPR'] = htmlentities ($aFirst[$i]);
			}
		} else {
			if (isset ($aLast[$i])) {
				/**
				* there is a modified entry but no corresponding original entry, so, it's an addition
				*/
				$aDiff[$i]['ADDED'] = htmlentities ($aLast[$i]);
			}
		}
	}
	return $aDiff;
}

$sFirst = 'test.php';
$sLast = 'test2.php';

$aDiff = fileDiff ($sFirst, $sLast);

foreach ($aDiff as $clef => $val) {
	echo 'LIGNE ', $clef+1, ' : ';
	switch (key ($val)) {
		case 'MODIFIED' :
			echo '<span style="color: #0000ff;">',$val['MODIFIED'],'</span><br />';
			break;
		case 'SUPPR' :
			echo '<span style="color: #ff0000;">',$val['SUPPR'],'</span><br />';
			break;
		case 'ADDED' :
			echo '<span style="color: #00ff00;">',$val['ADDED'],'</span><br />';
			break;
	}
}
?>

 Conclusion

Ici les 2 fichiers utilisés en exemple (dispos dans le zip) :
test.php :
<?php
echo 'Hello World';

$a = 1+2;
$b = $a++;

echo $b;
?>

test2.php :
<?php
echo 'Hello World';

$a = 1+2;
$b = $a++;
$c = ++$b;
echo $c;


echo $d;
?>

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip ASTUCES/HACK PHP
SQUELETTE DE GESTION DES DROITS
[PHP 5.1] CLASS STRING : NOUVEL EXEMPLE SUR LA SPL
Source avec Zip Source avec une capture [PHP 5.1] PHOTOPHOP (PHPDRAW 2)
Source avec Zip Source avec une capture [PHP5.1] O-LOC : CLASSE ET BACKOFFICE D'INTERNATIONALISATION

 Sources de la même categorie

SUPPRESSION AUTOMATIQUE DES FICHIERS RAW ORPHELINS APRÈS UN ... par malokaff
UPLOADER DES FICHIER DANSUN DOSSIER, SÉCURISÉ AVEC MOT DE PA... par raizzo
COMPTEUR DE VISITES SUR FICHIER par pierreSabatier
FONCTION RECURSIVE DE DOSSIERS par tefa24600
Source avec Zip CONVERSION DES UNITÉS INFORMATIQUE (O, KIO, MIO, GIO, TIO...... par genetApt151

 Sources en rapport avec celle ci

Source avec Zip CLASSE D'OBJET DE RECHERCHE DE MOTS DANS DES TABLEAUX ET/OU ... par 8Tnerolf8
Source avec Zip Source avec une capture LISTAGE DE FICHIERS par jeromin75
Source avec Zip Source avec une capture CLASS UPLOAD DE FICHIER EN PHP par devgoneti
Source avec Zip CLASSE D'UPLOAD DE FICHIER PHP par beejeridou
Source avec Zip Source avec une capture GESTIONNAIRE DE FICHIERS | MYSQL PHP 5.X {NEMENTON PHP MANA... par Nementon

Commentaires et avis

Commentaire de kankrelune le 22/06/2006 21:37:58

$myTrim = create_function ('$val', 'return trim ($val);');

Pourquoi faire... Utiliser trim directement dans le array_map aurrait suffit... non... .. ?

@ tchaOo°

Commentaire de coucou747 le 22/06/2006 21:45:18 administrateur CS

Salut
sur cette source, les différences ne se font que par lignes, c'est interessant comme méthode, pour toi, les deux fichiers doivent avoir la même taille... enfin dans le sens ou si on insère une ligne, alors les suivantes seront considérées commes modifiées... tu ne gères pas l'insersion... domage.

Commentaire de malalam le 22/06/2006 22:47:54 administrateur CS

Kankrelune => heu...parce que je n'y ai pas pensé...! Lol, je corrigerai.

Coucou => je prévois cet essai (c'est vraiment juste un essai) en vue de créer un CVS en php. En ce sens, tout changement dans le fichier m'intéresse, et doit apparaître. Donc oui, tu as raison sur le fait que je l'ai écrit ainsi parce qu'il m'intéresse ainsi : c'est une sécurité de savoir qu'une ligne a été sauté, éventuellement, sans autre modification. Et que dans ce cas, toutes les lignes suivantes sont considérées comme modifiées/ajoutées (pour la dernière, si on a eu un seul saut de ligne). Mais ta remarque est tout à fait justifiée et sensée...! Je rajouterai, à terme, cette distinction (si je m'en sors...c'est pas simple de recréer un CVS entièrement en PHP, sans développer une extension propre), dans la classe prévue à cet effet.
Je mettrai le package ici, quand j'en aurai fini avec.
Et, Coucou, tout ça, c'est de ta faute lol...tu m'as donné une sacrée idée qui ne cesse de me hanter, il y a quelques temps, suite à un de mes package : ma classe de documentation de packages. C'est dans la lignée...un package repository, avec travail collaboratif dessus, documentation, tests, échanges, etc...un CPAN en un peu différent, quoi ;-)

Commentaire de coucou747 le 22/06/2006 23:01:16 administrateur CS

ah oui, je me disais aussi que le cvs, c'était une de mes vielles idées à laquelle je pensais :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Comment tester les fichiers PHP [ par Clem ] Comment tester les fichiers PHP sans les publier sur son site ? Dans le genre de PWS avec l'asp Tri de fichiers par date [ par Clem ] Comment trier dans l'orde du plus nouveau au plus vieux, des dossiers ?J'ai trouvé pour afficher les dossiers :&lt;?$rep=opendir('.');while ($file = r Fichiers dans une base de donnée [ par Clem ] Comment uploader un fichier dans une base de données, et le downloader ? réaliser et envoyer des fichiers zip [ par pupuce ] J'ai vu qu'il est possible de créer des fichiers zip, jusque là je vois bien comment faire mais :Je veut pouvoir envoyer le zip au client, sans qu'il Compter des fichiers.... [ par FleX ] Alors voila. je voudrais me faire un script php3 qui compte le nombre de fichiers dans un dossier et que le resultat soit mis dans une variable, que j créer un fichier ???? petit PB [ par MangaII ] Hello les gars !Voilà, j'ai un petit soucis, j'ai besoin de créer des fichiers (TXT) sur mon site, depuis ma page en PHP ! le PB, c que je pe pas ! Je Encore les fichiers [ par koko ] bon c'est encore moi avec mes fichiers.txt... cette fois-ci, je voudrais que lorque j'ouvre le fichier, il mets les variables qui sont à l'intérieur d fichiers batch et username [ par booth ] bonjour, je cherche le moyen soit de lancer un batch sur la machine client, soit de récupérer directement son username (log windows ou netware)si kelk zipper plusieurs fichiers [ par eax ] help! je cherche à apprendre comment faire pour zipper plusieurs fichiers (des images par exemple). si qqun connait un bon tutorial ou un code source connection FTP par PHP [ par JulienC ] Bonjour à toutes et à tous,Mon but est de pouvoir uploader sur mon site des fichiers ayant une extension particulière (on les nommera .ext). Ces fichi


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,577 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales