使用diff比较包含HTML的文档

6
我正在构思一个用于撰写和编辑文件的系统(类似于Google文档,但没有实时协作功能)。我将使用WYSIWYG编辑器,因此文件将包含HTML标记。
编辑者将更改文档,原始用户应该查看这些修订并手动进行更改。
当涉及到HTML标记时,我如何使用差异系统?我希望修订版本能够显示任何格式上的更改,例如如果某些内容被加粗,则应该反映出这种变化。它还应该像普通的差异一样使内容更改可见。
如果我使用常规的差异系统,它会将HTML视为普通文本,显然不是这样。感谢任何指导!

如果您使用常规的差异系统,并将HTML视为常规文本,那么为什么不能正常工作呢?如果您加粗某些内容,则常规差异会看到加粗标记的额外文本。如果您删除HTML标记也是一样。 - Michael Irigoyen
在 HTML 上进行实际比较,但在并排显示时,呈现 HTML。突出显示更改的行,就像常规 diff 工具一样。应按预期工作。 - profitphp
2个回答

4

我使用过的最好的用于HTML差异比较的OSS库是DaisyDiffPHP版本)。

然而,差异化HTML或XML等数据是一个麻烦的问题。如果您可以在传递给差异算法之前进行一些预处理来简化要比较的数据,则可能会获得更好的结果。例如,如果您只使用像<p><b><i>等标签,请将它们标记化,并使用诸如diff-match-patchGNU Diff等差异化算法。然后再替换这些标记。请参阅diff-match-patch wiki页面以获取有关此问题的一些想法。


DaisyDiff正是我正在寻找的。这对我来说是一个巨大的帮助,谢谢orangepips。有一些东西我需要修改(例如,DaisyDiff没有注意段落标签的更改),但这应该是一个很好的起点。 - James Skidmore
注意:为了克服缺乏段落标签的变化检测,我只是在段落末尾自动添加↵符号,然后进行差异比较。这样它就可以捕捉到分割/合并的段落。 - James Skidmore

0
如果你尝试从头开始创建这个,你将会面临一大堆的烦恼。我建议你可以采用现成的解决方案-搜索"HTML差异化",你会看到一些供应商。
你可以采用一种方法,提取文本(去除标签)并比较未标记版本。 这很容易做到,但不能完全实现你想要的比较修订格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接