Traduction d'un tutorial de pradeep pradeep, écrit le 6 Mai 2007.
Quand il devient nécessaire de comparer deux ou plusieurs fichiers texte sous UNIX, la plupart des développeurs vont chercher le programme diff.
Ce logiciel, est inclus par défaut dans presque toutes les distributions Unix, compare les fichiers ligne par ligne et affiche les changements dans un certain nombre de différents formats de sortie.
Bien qu'à l'origine, diff est un utilitaire de ligne de commande,
des paquets pour reproduire ses fonctionnalités sont disponibles pour la plupart des environnements de développement et les languages,
y compris Perl, JSP, et PHP.
Venons en à Text_Diff, une classe PEAR qui permet de comparer le fichier contenu dans l'environnement PHP et proposer un rendu en différents formats.
Ce tutoriel va faire la démonstration de cette classe en l'action,
illustrant la façon dont vous pouvez l'utiliser
pour comparer dynamiquement du contenu des fichiers avec PHP, et de rendre les résultats sous forme de page Web.
Je vais supposer que vous avez une installation Apache et PHP et que la classe PEAR Text_Diff a été correctement installé.
Note: Vous pouvez installer le paquet PEAR Text_Diff directement à partir du Web, soit en le téléchargeant ou en utilisant les instructions fournies.
Mise en place de fichiers de test
Avant d'écrire le moindre code,
il est nécessaire de mettre en place les fichiers de test,
nous allons utiliser dans ce tutoriel.
Ce sont deux fichiers simple, avec quelques différences délibérée que Text_Diff devrait être en mesure de reperer.
L'extrait A est le premier fichier, nommé data1.txt.
Extrait A
[txt]
apple
banana
cantaloupe
drumstick
enchilada
fig
grape
horseradish
Et l'extrait B est le second fichier, nommé data2.txt.
Extrait B
[txt]
apple
bat
cantaloupe
drumstick
enchilada
fig
peach
pear
zebra
Effectuer une comparaison de base
Après avoir créé les fichiers, nous allons commencer par une simple illustration de la manière dont fonctionne Text_Diff.
Commençons avec l'extrait C.
Extrait C
[php]
<?php
// ici il faut adapter les chemins à votre install
include_once "Text/Diff.php";
include_once "Text/Diff/Renderer.php";
// On défini les fichiers à comparer
$file1 = "data1.txt";
$file2 = "data2.txt";
// On effectue le diff
$diff = &new Text_Diff(file($file1), file($file2));
// On construit le rendu et on affiche le résultat
$renderer = &new Text_Diff_Renderer();
echo $renderer->render($diff);
?>
C'est assez simple à première vue.
Il ya deux classes de base dans le paquet Text_Diff:
- Text_Diff (), qui effectue la comparaison et retourne diffoutput;
- et Text_Diff_Renderer (), qui forme les résultat diff dans un format qui est facilement compréhensible.
Le Text_Diff () l'objet, en particulier, doit être initialisé avec le contenu réel (et non pas l'emplacement) des deux fichiers à comparer.
Le script commence par l'initialisation de ces deux objets, en utilisant la fonction file() de PHP pour extraire le contenu de chaque fichier en une série de tableaux.
L'objet Text_Renderer() est ensuite utilisé pour créer le rendu au format standard diff,
un résultat qui devrait être familier à tout développeur UNIX:
[diff]
2c2
<banana
---
>bat
7,8c7,12
<grape
<horseradish
---
>peach
>pear
>
>
>
>zebra
Rendre les différences plus facile à lire
Maintenant,
la sortie ci-dessus n'est pas particulièrement facile à lire,
sauf si vous avez beaucoup d'expérience au décodage diff résultats.
C'est la raison pour laquelle Text_Diff est livré avec une série d'options de reformater ce résultat en quelque chose de plus lisible.
Ces options sont accessibles au travers de classes enfant de l'objet Text_Diff_Renderer()
et cela rend possible d'afficher le résultat de la comparaison en
soit format unifié ou inline .
Le script suivant (extraits D) est une modification de l'exemple précédent pour obtenir un format unifié:
Extrait D
[php]
<html>
<head></head>
<body>
<pre>
<?php
// ici il faut adapter les chemins à votre install
include_once "Text/Diff.php";
include_once "Text/Diff/Renderer.php";
include_once "Text/Diff/Renderer/unified.php";
// On défini les fichiers à comparer
$file1 = "data1.txt";
$file2 = "data2.txt";
// perform diff, print output
$diff = &new Text_Diff(file($file1), file($file2));
$renderer = &new Text_Diff_Renderer_unified();
echo $renderer->render($diff);
?>
</pre>
</body>
</html>
Constatez l'appel à la classe enfant lors de l'initialisation du moteur de rendu.
Et voici le résultat:
[diff]
@@ -1,8 +1,12 @@
apple
-banana
+bat
cantaloupe
drumstick
enchilada
fig
-grape
-horseradish
+peach
+pear
+
+
+
+zebra
Une rapide explication est ici nécéssaire:
dans le format unifié,
le signe plus (+) préfixe les lignes ajoutées,
le signe (-) préfixe les lignes supprimées,
et sans préfixe on a les lignes inchangées .
Si l'on compare les résultats ci-dessus avec les fichiers originaux,
il est assez facile de voir comment les diff générés
reflètent les lignes qui ont changé
et quel sont les changements.
Bien sûr, il est possible de le rendre encore plus facile à utiliser
- et c'est précisément ce que le formatage en ligne tente d'accomplir.
Dans ce format, des biffures sont utilisées pour indiquer
visuellement les caractères et les lignes qui ont changés.
L'extrait E vous montre comment l'utiliser.
Extrait E
[php]
<html>
<head></head>
<body>
<pre>
<?php
// ici il faut adapter les chemins à votre install
include_once "Text/Diff.php";
include_once "Text/Diff/Renderer.php";
include_once "Text/Diff/Renderer/inline.php";
// On défini les fichiers à comparer
$file1 = "data1.txt";
$file2 = "data2.txt";
// perform diff, print output
$diff = &new Text_Diff(file($file1), file($file2));
$renderer = &new Text_Diff_Renderer_inline();
echo $renderer->render($diff);
?>
</pre>
</body>
</html>
Et voici le rendu:
[html]
apple
<strike>banana</strike>bat
cantaloupe
drumstick
enchilada
fig
<strike> grape</strike>
<strike>horseradishpeach</strike>
pear
zebra
Voilà, ca c'est fait.
J'espère que vous avez maintenant une idée claire de la façon dont Text_Diff peut être utilisé pour rapidement et efficacement comparer des fichiers dans l'environnement PHP et de la façon dont le rendu peut être formaté pour faciliter la lisibilité.
Codez bien!