2009-09-01 5 views
8

मुझे एचटीएमएल टैग के साथ दो टेक्स्ट ब्लॉक लेने और तुलना करने की आवश्यकता है - दो टेक्स्ट ब्लॉक मर्ज करें और फिर एक संस्करण से अगले संस्करण में जो जोड़ा या हटा दिया गया है उसे हाइलाइट करें।2 एचटीएमएल टेक्स्ट ब्लॉक की तुलना कैसे दिखाएं

मैंने पीईएआर टेक्स्ट डिफ क्लास का उपयोग सादे टेक्स्ट की सफलतापूर्वक प्रस्तुत करने के लिए किया है, लेकिन जब मैं इसमें HTML टैग के साथ टेक्स्ट फेंकने का प्रयास करता हूं, तो यह यूजीली हो जाता है। शब्द और चरित्र-आधारित तुलना एल्गोरिदम की तुलना में कक्षा का उपयोग करता है, एचटीएमएल टैग टूट जाते हैं और मैं बदसूरत सामान जैसे <p><span class="new"> </</span>p> के साथ समाप्त होता हूं। यह एचटीएमएल का वध करता है।

क्या मूल मान्य HTML मार्कअप को संरक्षित करते समय टेक्स्ट तुलना उत्पन्न करने का कोई तरीका है?

सहायता के लिए धन्यवाद। मैं हफ्तों के लिए इस पर काम कर रहा हूं: [

यह सबसे अच्छा समाधान है जिसके बारे में मैं सोच सकता हूं: प्रत्येक प्रकार के एचटीएमएल टैग को 1 विशेष गैर-मानक चरित्र जैसे सेब लोगो (ऑप्ट शिफ्ट के) के साथ ढूंढें/बदलें, इस प्रकार के प्राइमेटिव मार्कडाउन के साथ तुलना प्रस्तुत करें, फिर गैर-मानक वर्णों को वापस टैग में वापस लाएं। कोई प्रतिपादन?

उत्तर

1

समस्या यह है कि आपके diff कार्यक्रम के रूप में व्यक्ति की तुलना में परमाणु टोकन के रूप में मौजूदा HTML टैग का इलाज किया जाना चाहिए न कि प्रतीत हो रहा है वर्ण।

यदि आपके इंजन में शब्द सीमाओं पर काम करने के लिए खुद को सीमित करने की क्षमता है, तो देखें कि क्या आप शब्द सीमाओं को निर्धारित करने वाले फ़ंक्शन को ओवरराइड कर सकते हैं, इसलिए यह HTML टैग को एक "शब्द" के रूप में पहचानता है और उसका इलाज करता है।

आप यह भी कर सकते हैं जैसा कि आप कह रहे हैं और अलग-अलग HTML टैग्स का लुकअप डिक्शनरी बनाते हैं जो प्रत्येक को एक अलग अप्रयुक्त यूनिकोड मान के साथ प्रतिस्थापित करता है (मुझे लगता है कि कुछ उपयोगकर्ता परिभाषित श्रेणियां आप उपयोग कर सकते हैं)। हालांकि, यदि आप ऐसा करते हैं, तो मार्कअप में किए गए किसी भी बदलाव को इस तरह माना जाएगा कि वे पिछले या निम्न शब्द में परिवर्तन थे, क्योंकि यूनिकोड वर्ण टोकननाइज़र को उस शब्द का हिस्सा बन जाएगा। अपने प्रत्येक टोकन से पहले और बाद में एक स्थान जोड़ना यूनिकोड वर्ण सादा पाठ परिवर्तनों से अलग HTML टैग परिवर्तन को अलग रखेंगे।

+0

यूनिकोड टोकन ढूंढ/प्रतिस्थापित करना आखिरकार काम करता है। मैंने बस एक खोल => मूल्य सरणी प्रत्येक उद्घाटन और समापन टैग और इसके संबंधित यूनिकोड चरित्र के साथ किया था। फिर मैंने तुलना उत्पन्न की, और टोकन/टैग स्वैप को उलट दिया। –

+1

मुझे पॉल बटलर की सरल डिफ लिपि भी पाई पैकेज की तुलना में लंबे पाठ के लिए बेहतर काम करने के लिए मिली। पीयर ने शब्द-से-शब्द पर ध्यान केंद्रित किया, जबकि कसाई के सेटअप ने तारों के रूप में एक साथ जुड़े मतभेदों के साथ बेहतर उत्पादन किया। लिंक: http://github.com/paulgb/simplediff/blob/5bfe1d2a8f967c7901ace50f04ac2d9308ed3169/simplediff.php –

+0

हाय @ स्टेवजी, आप किस तरह के यूनिकोड का उपयोग करते थे? क्योंकि अगर इसे "<\ u123" या "% 3C" के साथ "<" के लिए माना जाता है तो कुछ diff एल्गोरिदम एक ही शब्द के रूप में नहीं मानते हैं। और यदि मैं केवल चाबियों के रूप में अक्षरों का उपयोग करके मैप का उपयोग करता हूं तो मैं कैसे गारंटी दे सकता हूं कि HTML के टेक्स्ट भाग पर किसी और चीज़ के साथ संघर्ष नहीं करेगा? धन्यवाद! http://i.imgur.com/OAJUAP1.png – Luccas

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

त्वरित उत्तर के लिए धन्यवाद ... लेकिन इससे वास्तव में समस्या खराब हो जाएगी:/क्योंकि तब मैं एक टैग को अब तक बहु-चार तारों में परिवर्तित कर दूंगा, जो तुलना वर्ग अलग हो जाएगा। अंतिम परिणाम वैध HTML मार्कअप होना आवश्यक है ताकि इसे किसी वेबपृष्ठ पर दिखाया जा सके। मैं नहीं चाहता कि अंतिम उपयोगकर्ता किसी भी एचटीएमएल टैग को देखे - उन्हें किसी पृष्ठ पर एचटीएमएल प्रस्तुत करने की आवश्यकता है। जिस पाठ से मैं काम कर रहा हूं उसे ब्लॉग लेखों के समान माना जा सकता है - बस एच, पी, ए, और आईएमजी टैग। मैं बस दिखाने के लिए हाइलाइटिंग जोड़ना चाहता हूं। –

3

सरल Diff, पॉल बटलर द्वारा, लगता है जैसे कि यह वास्तव में क्या करने के लिए आपको क्या चाहिए बनाया गया है: अपने php कोड में http://github.com/paulgb/simplediff/blob/5bfe1d2a8f967c7901ace50f04ac2d9308ed3169/simplediff.php

सूचना वहाँ एक एचटीएमएल आवरण है कि: htmlDiff ($ वर्ष, $ नई)

(उस पर उनके ब्लॉग पोस्ट: http://paulbutler.org/archives/a-simple-diff-algorithm-in-php/

+0

यह एल्गोरिदम पीयर की तुलना में काफी बेहतर काम करता है। संसाधन को इंगित करने के लिए धन्यवाद। –

+0

ग्रेट। आपका स्वागत है। – micahwittman

1

पहले प्रत्येक ब्लॉक पर एक HTML tidier/formatter का उपयोग करने के बारे में क्या? यह एक मानक "संरचना" बनाएगा जो आपके diff को

0

here से अपने स्वयं के उत्तर की एक प्रति निगलना आसान हो सकता है।


क्या DaisyDiff (Java और PHP उपलब्ध vesions) के बारे में।

निम्न सुविधाएँ वास्तव में अच्छा कर रहे हैं: "जंगली में" पाया जा सकता है कि बुरी तरह से गठन HTML के साथ

  • काम करता है।
  • एक्सएमएल पेड़ की तुलना में एचटीएमएल में अंतर अधिक विशिष्ट है। टेक्स्ट नोड का भाग बदलना पूरे नोड को बदलने का कारण नहीं बनता है।
  • डिफ़ॉल्ट दृश्य diff के अतिरिक्त, HTML स्रोत को सुसंगत रूप से अलग किया जा सकता है।
  • परिवर्तनों के विवरण समझने में आसान प्रदान करता है।
  • डिफ़ॉल्ट जीयूआई कुंजीपटल शॉर्टकट्स और लिंक के माध्यम से संशोधनों की आसान ब्राउज़िंग की अनुमति देता है।
1

मुझे आश्चर्य है कि मीडियाविकी के Visual Diff पर आधारित कोई भी HTMLDiff का उल्लेख नहीं करता है। इसे आज़माएं, मैं आपके जैसे कुछ ढूंढ रहा था और इसे बहुत उपयोगी पाया।

+0

हम इसका उपयोग कर रहे हैं, लेकिन कभी-कभी यह एक खाली अनुच्छेद देता है (जब कोई मतभेद नहीं होता है, तो इसे मूल अपरिवर्तित वापस करना होता है, लेकिन इस मामले में * हैं * मतभेद) और दूसरी बार यह एचटीएमएल को चारों ओर ले जाता है (एक हटाए गए अनुच्छेद को पैराग्राफ के साथ विलय कर दिया जाता है जब इसे चिह्नित किया जाता है)। यह सिर्फ कुछ lovin 'की जरूरत है। –

+0

और फिर यह बग है ([HTMLDiff बहुत टूटा हुआ है] (https://phabricator.wikimedia.org/T21859)) जिसे MediaWiki से HTMLDiff को हटाकर हल किया गया था। :( –

+0

@ डेविड हार्केनेस का कारण यह है कि मीडियाविकि डेवलपर्स को यह नहीं पता कि कोई भी इसका इस्तेमाल कर रहा था या नहीं। Phabricator.wikimedia.org पर प्रतिक्रिया बहुत उपयोगी होगी। – Nemo