9

htmlタグ付きの2つのテキストブロックを取得して比較をレンダリングする必要があります。2つのテキストブロックをマージしてから、あるバージョンから次のバージョンに追加または削除されたものを強調表示します。

PEAR Text_Diffクラスを使用してプレーンテキストの比較を正常にレンダリングしましたが、htmlタグを含むテキストをスローしようとすると、見苦しくなります。クラスが使用する単語と文字ベースの比較アルゴリズムのために、htmlタグが壊れて、私はのような醜いものになってしまい<p><span class="new"> </</span>p>ます。それはhtmlを虐殺します。

元の有効なhtmlマークアップを保持しながらテキスト比較を生成する方法はありますか?

助けてくれてありがとう。私はこれに何週間も取り組んできました:[

これは私が考えることができる最善の解決策です:各タイプのhtmlタグを見つけて、アップルのロゴ(opt shift k)のような1つの特別な非標準文字で置き換え、この種の原始的なマークダウンとの比較をレンダリングしてから、非標準のマークダウンを元に戻します標準文字をタグに戻します。フィードバックはありますか?

4

6 に答える 6

3

Paul Butler による Simple Diffは、必要なことを正確に実行するように設計されているように見えます。

彼の php コードには、html ラッパーがあることに注意してください: htmlDiff($old, $new)

(彼のブログ投稿: http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/

于 2009-09-01T05:39:17.237 に答える
1

最初に各ブロックでhtml tidier / formatterを使用するのはどうですか? これにより、差分が飲み込みやすい標準的な「構造」が作成されます

于 2009-09-01T07:32:51.563 に答える
1

MediaWiki のVisual Diffに基づくHTMLDiffについて誰も言及していないのが不思議です。試してみてください。私はあなたのようなものを探していて、とても便利だと思いました。

于 2014-01-07T15:15:42.823 に答える
1

問題は、差分プログラムが既存の HTML タグを個々の文字ではなくアトミック トークンとして扱う必要があることです。

エンジンが単語境界での作業に制限できる場合は、単語境界を決定する関数をオーバーライドして、HTML タグを単一の「単語」として認識および処理できるかどうかを確認してください。

あなたが言っているように、それぞれを個別の未使用の Unicode 値に置き換える個別の HTML タグの検索辞書を作成することもできます (使用できるユーザー定義の範囲がいくつかあると思います)。ただし、これを行うと、マークアップへの変更は、前または次の単語への変更であるかのように扱われます。これは、Unicode 文字がトークナイザーに対してその単語の一部になるためです。各トークン Unicode 文字の前後にスペースを追加すると、HTML タグの変更とプレーン テキストの変更が分離されます。

于 2009-09-01T05:54:17.083 に答える
0

ここからの私自身の答えのコピー。


DaisyDiffJavaおよびPHPバージョンが利用可能)についてはどうですか。

次の機能は本当に素晴らしいです:

  • 「野生で」見つけることができるひどく形成されたHTMLで動作します。
  • 差分は、XMLツリーが異なるよりもHTMLに特化しています。テキストノードの一部を変更しても、ノード全体が変更されることはありません。
  • デフォルトのビジュアル差分に加えて、HTMLソースをコヒーレントに差分することができます。
  • 変更の説明をわかりやすく提供します。
  • デフォルトのGUIを使用すると、キーボードショートカットとリンクを使用して変更を簡単に参照できます。
于 2009-10-20T08:59:36.390 に答える
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 に答える