2009-09-01 15 views
8

Tôi cần lấy hai khối văn bản có thẻ html và hiển thị so sánh - hợp nhất hai khối văn bản và sau đó đánh dấu những gì đã được thêm hoặc xóa khỏi phiên bản này sang phiên bản tiếp theo.Cách hiển thị so sánh 2 khối văn bản html

Tôi đã sử dụng lớp PE_D Text_Diff để hiển thị thành công các văn bản đồng bằng, nhưng khi tôi cố gắng ném văn bản bằng thẻ html vào trong đó, nó sẽ bị UGLY. Do thuật toán so sánh từ và ký tự dựa trên nhân vật mà lớp sử dụng, các thẻ html bị hỏng và tôi kết thúc với những thứ xấu xí như <p><span class="new"> </</span>p>. Nó giết html.

Có cách nào để tạo so sánh văn bản trong khi vẫn giữ lại đánh dấu html hợp lệ ban đầu không?

Cảm ơn sự giúp đỡ. Tôi đã làm việc này trong nhiều tuần: [

Đây là giải pháp tốt nhất mà tôi có thể nghĩ đến: tìm/thay thế từng loại thẻ html bằng 1 ký tự không chuẩn đặc biệt như biểu tượng quả táo (opt shift k), làm cho so sánh với loại đánh dấu nguyên thủy này, sau đó hoàn nguyên các ký tự không chuẩn trở lại thành các thẻ. Bạn có phản hồi gì không?

Trả lời

1

vấn đề dường như là chương trình diff của bạn nên được điều trị các thẻ HTML hiện như tokens nguyên tử chứ không phải là cá nhân nhân vật.

Nếu động cơ của bạn có khả năng tự giới hạn hoạt động trên các ranh giới từ, hãy xem bạn có thể ghi đè chức năng xác định ranh giới từ hay không. Bạn cũng có thể làm như bạn đang nói và tạo một từ điển tra cứu các thẻ HTML riêng biệt thay thế mỗi từ bằng một giá trị Unicode không được sử dụng riêng biệt (tôi nghĩ rằng có một số phạm vi do người dùng xác định mà bạn có thể sử dụng). Tuy nhiên, nếu bạn thực hiện việc này, bất kỳ thay đổi nào đối với đánh dấu sẽ được coi như là thay đổi đối với từ trước hoặc sau, bởi vì ký tự Unicode sẽ trở thành một phần của từ đó với trình mã thông báo. Thêm dấu cách trước và sau mỗi ký tự Unicode mã thông báo của bạn sẽ giữ cho các thay đổi thẻ HTML tách biệt với các thay đổi văn bản thuần túy.

+0

Mã thông báo unicode tìm/thay thế là những gì cuối cùng đã làm việc. Tôi chỉ làm một mảng key => value với mỗi thẻ mở và đóng và ký tự unicode liên quan của nó. Sau đó, tôi tạo ra so sánh, và đảo ngược việc trao đổi thẻ/thẻ. –

+1

Tôi cũng tìm thấy kịch bản Simple Diff của Paul Butler để làm việc tốt hơn cho văn bản dài hơn gói PEAR. PEAR tập trung từ-to-word trong khi thiết lập của Butcher tạo ra sản lượng tốt hơn với những khác biệt còn lại chunked với nhau như chuỗi. Liên kết: http://github.com/paulgb/simplediff/blob/5bfe1d2a8f967c7901ace50f04ac2d9308ed3169/simplediff.php –

+0

Xin chào @SteveG., Bạn đã sử dụng loại unicodes nào? Bởi vì nếu nó được xử lý bằng "\\ u123" hoặc "% 3C" cho "<" một số thuật toán khác không được coi là cùng một từ. Và nếu tôi ánh xạ bằng cách sử dụng các phím chỉ với các chữ số như thế nào tôi có thể garantee rằng sẽ không xung đột với cái gì khác trên phần văn bản của html? Cảm ơn! http://i.imgur.com/OAJUAP1.png – Luccas

0

Thử chạy khối HTML của bạn thông qua chức năng này đầu tiên:

htmlentities(); 

Điều đó sẽ chuyển đổi tất cả các "<" 's và '>'' s vào mã tương ứng của họ, có lẽ sửa chữa vấn đề của bạn.

//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); 
+0

Cảm ơn câu trả lời nhanh ... nhưng điều đó thực sự sẽ làm cho vấn đề tồi tệ hơn:/bởi vì sau đó tôi sẽ một thẻ được chuyển đổi thành chuỗi dài hơn nhiều char, mà lớp so sánh sẽ chia tách. Kết quả cuối cùng cần phải là đánh dấu HTML hợp lệ để nó có thể được hiển thị trên trang web. Tôi không muốn người dùng cuối xem bất kỳ thẻ html nào - họ cần xem html được hiển thị trên trang. Văn bản tôi đang xử lý có thể được coi như các bài viết trên blog - chỉ cần các thẻ h, p, a và img. Tôi chỉ muốn thêm đánh dấu để hiển thị những gì đã thay đổi. –

3

Simple Diff, bởi Paul Butler, trông như thể nó được thiết kế để thực hiện chính xác những gì bạn cần: http://github.com/paulgb/simplediff/blob/5bfe1d2a8f967c7901ace50f04ac2d9308ed3169/simplediff.php

Thông báo trong mã php của mình rằng có một wrapper html: htmlDiff ($ cũ, $ mới)

(bài viết trên blog của ông về nó: http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/

+0

Thuật toán này hoạt động tốt hơn nhiều so với thuật toán PEAR. Cảm ơn bạn đã chỉ ra tài nguyên. –

+0

Tuyệt vời. Bạn được chào đón nhất. – micahwittman

1

Điều gì về việc sử dụng trình phân tích/định dạng html trên mỗi khối trước? Điều này sẽ tạo ra một "cấu trúc" chuẩn mà cách khác của bạn có thể dễ nuốt hơn

0

Bản sao câu trả lời của riêng tôi từ here.


gì về DaisyDiff (JavaPHP vesions sẵn).

tính năng Sau đây là thật sự tốt đẹp:

  • trình với HTML nặng hình thành có thể được tìm thấy "trong tự nhiên".
  • Sự khác biệt là chuyên biệt hơn về HTML so với các khác biệt về cây XML. Thay đổi một phần của một nút văn bản sẽ không làm thay đổi toàn bộ nút.
  • Ngoài sự khác biệt về hình ảnh mặc định, nguồn HTML có thể được phân biệt rõ ràng.
  • Cung cấp mô tả dễ hiểu về các thay đổi.
  • GUI mặc định cho phép dễ dàng duyệt các sửa đổi thông qua các phím tắt và liên kết.
1

Tôi tự hỏi rằng không ai đề cập đến HTMLDiff dựa trên MediaWiki Visual Diff. Hãy thử xem, tôi đang tìm kiếm thứ gì đó giống như bạn và thấy nó khá hữu ích.

+0

Chúng tôi đang sử dụng điều này, nhưng đôi khi nó trả về một đoạn trống (khi không có sự khác biệt, nó là nghĩa vụ phải trả lại bản gốc không thay đổi, nhưng trong trường hợp này có * * sự khác biệt) và các lần khác nó di chuyển HTML xung quanh (một đoạn bị loại bỏ được sáp nhập với đoạn trước khi nó đánh dấu rằng nó đã được gỡ bỏ). Nó chỉ cần một số lovin '. –

+0

Và sau đó có lỗi này ([HTMLDiff là khủng khiếp bị hỏng] (https://phabricator.wikimedia.org/T21859)) đã được giải quyết bằng cách loại bỏ HTMLDiff từ MediaWiki. :( –

+0

@DavidHarkness một phần lý do là các nhà phát triển MediaWiki không biết bất kỳ ai đã hoặc đang sử dụng nó. Phản hồi trên phabricator.wikimedia.org sẽ rất hữu ích. – Nemo