Quelle est la manière la plus simple de mettre en évidence la différence entre deux chaînes en PHP?
Je pense à la page d'historique de modification de Stack Overflow, où le nouveau texte est en vert et le texte supprimé est en rouge. S'il y a des fonctions ou des classes pré-écrites disponibles, ce serait idéal.
Je viens d'écrire une classe pour calculer le plus petit nombre (à ne pas prendre littéralement) de modifications pour transformer une chaîne en une autre chaîne:
http://www.raymondhill.net/finediff/
Il a une fonction statique pour rendre une version HTML du diff.
C'est une première version, et susceptible d'être améliorée, mais cela fonctionne très bien pour le moment, donc je la jette là-bas au cas où quelqu'un aurait besoin de générer un diff compact efficacement, comme j'en avais besoin.
Edit: C'est sur Github maintenant: https://github.com/gorhill/PHP-FineDiff
la source
Si vous voulez une bibliothèque robuste, Text_Diff (un package PEAR) semble plutôt bon. Il a des fonctionnalités assez intéressantes.
la source
C'est une belle, également http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/
la source
if($matrix[$oindex][$nindex] > $maxlen){
Undefined variable: maxlen
Voici une courte fonction que vous pouvez utiliser pour différencier deux tableaux. Il implémente l' algorithme LCS :
Il génère deux tableaux:
Si vous remplissez un tableau avec des caractères, il peut être utilisé pour calculer la différence en ligne. Maintenant, une seule étape pour mettre en évidence les différences:
Par exemple.:
Sortira:
S
TackOserveurFFaulowtNotes complémentaires:
la source
computeDiff is not found
Il existe également une extension PECL pour xdiff:
En particulier:
Exemple du manuel PHP:
la source
J'ai eu de terribles problèmes avec les alternatives basées sur PEAR et les alternatives plus simples présentées. Voici donc une solution qui exploite la commande Unix diff (évidemment, vous devez être sur un système Unix ou avoir une commande Windows diff fonctionnelle pour que cela fonctionne). Choisissez votre répertoire temporaire préféré et modifiez les exceptions en codes de retour si vous préférez.
la source
C'est le meilleur que j'ai trouvé.
http://code.stephenmorley.org/php/diff-implementation/
la source
$sequence1 = $string1; $sequence2 = $string2; $end1 = strlen($string1) - 1; $end2 = strlen($string2) - 1;
par$sequence1 = preg_split('//u', $string1, -1, PREG_SPLIT_NO_EMPTY); $sequence2 = preg_split('//u', $string2, -1, PREG_SPLIT_NO_EMPTY); $end1 = count($sequence1) - 1; $end2 = count($sequence2) - 1;
Ce que vous recherchez est un "algorithme de diff". Une recherche rapide sur Google m'a conduit à cette solution . Je ne l'ai pas testé, mais peut-être qu'il fera ce dont vous avez besoin.
la source
Un port php de Neil Frasers diff_match_patch (sous licence Apache 2.0)
la source
Je recommanderais de regarder ces fonctions impressionnantes du noyau PHP:
similar_text - Calcule la similitude entre deux chaînes
http://www.php.net/manual/en/function.similar-text.php
levenshtein - Calculer la distance de Levenshtein entre deux chaînes
http://www.php.net/manual/en/function.levenshtein.php
soundex - Calcule la clé soundex d'une corde
http://www.php.net/manual/en/function.soundex.php
metaphone - Calcule la clé de métaphone d'une chaîne
http://www.php.net/manual/en/function.metaphone.php
la source
Je suis tombé sur cette classe de diff PHP par Chris Boulton basée sur difflib Python qui pourrait être une bonne solution:
PHP Diff Lib
la source
Autre solution (pour une comparaison côte à côte par opposition à une vue unifiée): https://github.com/danmysak/side-by-side .
la source