Существуют ли библиотеки для отображения различий между двумя веб-страницами?
Я ищу библиотеку на любом языке - желательно PHP, но это отображает разницу между двумя веб-страницами. Различия могут отображаться бок о бок, все в одном документе или любым другим творческим способом.
Примеры того, как это будет выглядеть:
Я НЕ Ищем сырой код, отличный от этого: http://thinkingphp.org/img/code_coverage_html_diff_view.png. Я НЕ хочу показать разницу между двумя наборами HTML. Я хочу показать различия в визуализированной форме WYSIWYG.
Каждое решение, которое я пробовал, страдает одной или несколькими из следующих проблем:
- Если я изменю атрибут элемента (например, измените
[table border="1"]
на [table border="2"]
), тогда у меня будет дополнительный тег таблицы на выходе (например, [table border="1"][table border="1"][tr][td]...
). И один тег таблицы будет иметь тег del, а другой будет иметь тег ins вокруг него, и это, очевидно, вызовет проблемы.
- Если я изменяю
[html][body][b]some content here[/b][/body][/html]
на [html][body][i]some other content here[/i][/body][/html]
, тогда он выглядит как [html][body][b][del]original[/del][i][ins]new[/ins] content here[/b][/i][/body][/html]
Я ищу идеи из коробки. Любые идеи приветствуются.
Ответы
Ответ 1
Daisy Diff - отличная программа diff, разработанная в java, которая делает очень приличную работу при сравнении HTML-кода.
У него даже есть возможность пойти влево и вправо, чтобы пересмотреть сделанные изменения. Daisy Diff настолько мощна, что может обрабатывать изменения атрибутов внутри тегов, он скажет вам, было ли изменено изображение или была удалена или обновлена ссылка.
Проект с открытым исходным кодом может быть загружен из Google: http://code.google.com/p/daisydiff/
Я знаю, что это не php, но это может быть ваш лучший шанс иметь приличный html diff. Используйте системные или shell_exec php методы для выполнения такой строки:
java -jar daisydiff.jar http://myPageOld.html html://myPageNew.html
--file=result.html
--output=html
--type=html
результат вашего diff пойдет в файл result.html. Я рекомендую вам его использовать!
Ответ 2
Отношение между html-кодом и отображаемой страницей недостаточно для этого, чтобы работать в общем случае. Вы должны быть более конкретными для решения проблемы.
- Изменения css влияют на это
- Вы хотите обработать недопустимый html
- это проще для конкретного браузера (версии)
Ответ 3
Одна из настроек, которые вам нравятся, - это скриншот со страницы Википедии. Если это тот тип механизма, который вы ищете, и он должен быть в PHP, то почему бы не скачать MediaWiki и посмотрите на часть своего кода, ответственного за генерацию diff?
Вероятно, это самая близкая вещь, которую вы найдете в общем, не требующем установки, готовом решении. (По крайней мере, это самая близкая вещь, о которой я знаю).
Ответ 4
Мое решение этой проблемы требует Microsoft Word. Хотя подобные вещи могут быть возможны и с другими приложениями для инструментария производительности.
Если вы открываете HTML-страницы в Word, они преобразуют их в обычные документы и поэтому их можно легко визуально сравнивать. Поэтому в диалоговом окне Review..Compare вы можете просто указать пути HTML как имена файлов и открыть их, как если бы они были документами Word. Это хорошая идея отключить опцию "сравнить форматирование" в этом диалоговом окне, чтобы избежать множества странных ложных срабатываний. После сопоставления документов вы можете отступать и переходить через изменения с помощью кнопок "Предыдущий" и "Следующий" на ленте "Обзор". Изменяет ленту.
Мне пришлось сравнить довольно много документов, поэтому я написал код для этого.
Sub CompareHTML()
Dim doc1 As Document, doc2 As Document
Set doc1 = Documents.Open("http://mydevsite.com/reports/1717")
Set doc2 = Documents.Open("http://mylivesite.com/reports/1717")
Application.CompareDocuments OriginalDocument:=doc1, _
RevisedDocument:=doc2, Destination:=wdCompareDestinationNew, _
Granularity:=wdGranularityWordLevel, CompareFormatting:=False, _
CompareCaseChanges:=True, CompareWhitespace:=False, CompareTables:=True, _
CompareHeaders:=True, CompareFootnotes:=True, CompareTextboxes:=True, _
CompareFields:=True, CompareComments:=True, CompareMoves:=True, _
RevisedAuthor:="Author", IgnoreAllComparisonWarnings:=False
doc1.Close
doc2.Close
End Sub