9
votes

Comment montrer une comparaison de 2 blocs de texte HTML

J'ai besoin de prendre deux blocs de texte avec des balises HTML et de faire une comparaison - fusionner les deux blocs de texte, puis mettez en surbrillance ce qui a été ajouté ou supprimé d'une version à la prochaine.

J'ai utilisé la classe Text_Diff pour rendre avec succès des comparaisons du texte plaine , mais lorsque j'essaie de lancer du texte avec des balises HTML, elle devient laid. En raison du mot et des caractères, les algorithmes de la classe utilisent la classe utilise, les balises HTML sont cassées et je me retrouve avec des trucs laides comme

. Il change le HTML.

existe-t-il un moyen de générer une comparaison de texte tout en préservant le marquage HTML valide d'origine?

Merci pour l'aide. Je travaille sur cela pendant des semaines: [

C'est la meilleure solution que je puisse penser: trouver / remplacer chaque type d'étiquette HTML avec 1 caractère spécial non standard, comme le logo Apple (Opt Shift K), rendu la comparaison avec ce type de marquage primaire, puis revenir les caractères non standard dans les étiquettes. Tout retour?


0 commentaires

6 Réponses :


0
votes

Essayez d'exécuter vos blocs HTML via cette fonction: xxx pré>

qui devrait convertir toutes vos " "dans leurs codes correspondants, peut-être fixer votre problème . P>

//Example:
$html_1 = "<html><head></head><body>Something</body></html>"
$html_2 = "<html><head></head><body><p id='abc'>Something Else</p></body></html>"

//Below code taken from http://www.go4expert.com/forums/showthread.php?t=4189.
//Not sure if/how it works exactly

$diff = &new Text_Diff(htmlentities($html_1), htmlentities($html_2));
$renderer = &new Text_Diff_Renderer();
echo $renderer->render($diff);


1 commentaires

Merci pour la réponse rapide ... mais cela rendrait le problème pire: / parce que je serais ensuite converti en des cordes multi-charmes plus longues, que la classe de comparaison se séparera. Le résultat final doit être un marquage HTML valide afin qu'il puisse être affiché sur une page Web. Je ne veux pas que l'utilisateur final ne voit aucune balises HTML - elles doivent voir HTML rendu sur une page. Le texte que je traite peut être considéré comme comme des articles de blog - Juste H, P, A et IMG Tags. Je veux juste ajouter de la surbrillance pour montrer ce qui a changé.



3
votes

SIMPLE DIFF, par Paul Butler, on dirait qu'il est conçu de faire exactement ce dont vous avez besoin: http://github.com/paulgb/simplediff/bliv/5bfe1d2a8f967c7901ace50f04ac2d9308ed3169/simplediff.php

Notez dans son code PHP qu'il y a une wrapper HTML: HTMLDIFF ($ OLD, $ nouveau)

(son article de blog sur elle: http: // paulbutler .org / Archives / A-SIMPLE-DIFF-ALGORITHM-IN-PHP /


1 commentaires

Cet algorithme fonctionne beaucoup mieux que la poire. Merci d'avoir souligné la ressource.



1
votes

Le problème semble être que votre programme DIFF devrait traiter des balises HTML existantes comme des jetons atomiques plutôt que comme des caractères individuels.

Si votre moteur a la capacité de se limiter à travailler sur des limites de mots, voir si vous pouvez remplacer la fonction qui détermine les limites des mots, de sorte qu'elle reconnaît et traite des balises HTML comme un "mot" unique.

Vous pouvez également faire comme vous dites et créez un dictionnaire de recherche de balises HTML distinctes qui remplacent chacune une valeur non utilisée non utilisée distincte (je pense que vous pouvez utiliser certaines plages définies par l'utilisateur). Toutefois, si vous le faites, toute modification apportée au balisage sera traitée comme s'il s'agissait d'une modification du mot précédent ou suivant, car le caractère Unicode fera partie de ce mot au Tokenizer. Ajout d'un espace avant et après que chacun de vos caractères de jeton Unicode garderait les modifications de la balise HTML distinctes des modifications du texte brut.


3 commentaires

Le jeton Unicode trouve / remplacer est ce qui a finalement fonctionné. Je viens de faire une clé de clé => Valeur avec chaque étiquette d'ouverture et de fermeture et de son caractère Unicode associé. Ensuite, j'ai généré la comparaison et ai annulé le swap Token / Tag.


J'ai également trouvé le simple script diff de Paul Butler pour travailler beaucoup mieux pour un texte long que le colis de poirier. Word sur mot de poire axé sur le mot alors que la configuration de Boucher a produit une meilleure production avec des différences restantes à la suite de cordes. Link: Github.com/Paulgb/simplediff/blob/...


Salut @steveg., Quel genre d'unicodes avez-vous utilisé? Parce que si elle est traitée avec "\\ u123" ou "% 3c" pour "<" des différents algorithmes ne considérons pas comme le même mot. Et si je mappe d'utiliser des clés uniquement avec des chiffres comme des lettres Comment puis-je garantir qui ne sera pas en conflit avec autre chose sur la partie texte de HTML? Merci! i.Imgur.com/oajuap1.png



1
votes

Qu'en est-il d'utiliser un teneur / formateur HTML sur chaque bloc d'abord? Cela créera une "structure" standard que votre diff pour peut-être plus facile à avaler


0 commentaires


1
votes

Je me demande que personne n'envoyait HTTPLIFF basé sur le Visual Diff . Essayez, je cherchais quelque chose comme vous et je l'ai trouvé plutôt utile.


3 commentaires

Nous utilisons cela, mais cela renvoie parfois un paragraphe vide (lorsqu'il n'y a pas de différence, il est censé renvoyer l'original inchangé, mais dans ce cas, sont Différences) et d'autres fois qu'il déplace HTML Autour (un paragraphe supprimé est fusionné avec le paragraphe avant de le marquer qu'il a été supprimé). Cela a juste besoin d'amour.


Et puis il y a ce bogue ( HTMLDiff est terriblement cassé ) qui a été résolu en supprimant HTMLDiff de MediaWiki. :(


@DavidHarkness Une partie de la raison est que les développeurs MediaWiki ne connaissent personne ou l'utilise. Commentaires sur Phabricator.Wikimedia.org serait très utile.