9

我需要使用 html 标签获取两个文本块并进行比较 - 合并两个文本块,然后突出显示从一个版本添加或删除的内容到下一个版本。

我已经使用 PEAR Text_Diff 类成功地呈现了文本的比较,但是当我尝试在其中抛出带有 html 标签的文本时,它变得丑陋。由于该类使用基于单词和字符的比较算法,html 标签被破坏,我最终得到了像<p><span class="new"> </</span>p>. 它屠杀了html。

有没有办法在保留原始有效 html 标记的同时生成文本比较?

谢谢您的帮助。我已经为此工作了几个星期:[

这是我能想到的最佳解决方案:使用 1 个特殊的非标准字符(如苹果徽标(opt shift k))查找/替换每种类型的 html 标签,使用这种原始降价进行比较,然后恢复非标准字符回到标签。任何反馈?

4

6 回答 6

3

Paul Butler 的 Simple Diff 看起来好像它旨在完全满足您的需求:http: //github.com/paulgb/simplediff/blob/5bfe1d2a8f967c7901ace50f04ac2d9308ed3169/simplediff.php

注意在他的 php 代码中有一个 html 包装器: htmlDiff($old, $new)

(他的博客文章: http: //paulbutler.org/archives/a-simple-diff-algorithm-in-php/

于 2009-09-01T05:39:17.237 回答
1

问题似乎是您的差异程序应该将现有的 HTML 标记视为原子标记而不是单个字符。

如果您的引擎能够将自己限制为处理单词边界,请查看您是否可以覆盖确定单词边界的函数,以便它将 HTML 标记识别并视为单个“单词”。

您也可以按照您的说法创建一个查找字典,其中包含不同的 HTML 标记,用不同的未使用的 Unicode 值替换每个标记(我认为您可以使用一些用户定义的范围)。但是,如果您这样做,对标记的任何更改都将被视为对前一个或后一个单词的更改,因为 Unicode 字符将成为该单词的一部分。在每个令牌 Unicode 字符之前和之后添加一个空格将使 HTML 标记更改与纯文本更改分开。

于 2009-09-01T05:54:17.083 回答
1

首先在每个块上使用 html 整理器/格式化程序怎么样?这将创建一个标准的“结构”,您的差异可能会更容易接受

于 2009-09-01T07:32:51.563 回答
1

我想知道没有人提到基于 MediaWiki 的Visual Diff的HTMLDiff。试试看,我一直在寻找像你这样的东西,发现它非常有用。

于 2014-01-07T15:15:42.823 回答
0

首先尝试通过这个函数运行你的 HTML 块:

htmlentities();

这应该将您所有的“<”和“>”转换为相应的代码,也许可以解决您的问题。

//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);
于 2009-09-01T05:12:28.307 回答
0

我自己的答案的副本来自这里


DaisyDiff怎么样(JavaPHP版本可用)。

以下功能非常好:

  • 适用于可以“在野外”找到的格式错误的 HTML。
  • 差异在 HTML 中比 XML 树的差异更专业。更改部分文本节点不会导致更改整个节点。
  • 除了默认的视觉差异之外,HTML 源代码可以连贯地进行差异。
  • 提供易于理解的更改说明。
  • 默认 GUI 允许通过键盘快捷键和链接轻松浏览修改。
于 2009-10-20T08:59:36.390 回答