آیا تا به حال پیش آمده که دو نسخه از یک متن را داشته باشید و بخواهید بدانید چه تفاوتهایی بین آنها وجود دارد؟ شاید یک قرارداد حقوقی را ویرایش کردهاید و میخواهید تغییرات را ببینید، یا یک مقاله را بازنویسی کردهاید و میخواهید بدانید چه بخشهایی تغییر کرده است. ابزار مقایسه دو متن آنلاین (Diff Checker) به شما این امکان را میدهد که در چند ثانیه، تمام تفاوتهای بین دو متن را بهصورت بصری و دقیق مشاهده کنید. این ابزار رایگان، بدون نیاز به ثبتنام و کاملاً آنلاین، از الگوریتم استاندارد LCS (Longest Common Subsequence) استفاده میکند که همان الگوریتم مورد استفاده در نرمافزارهای حرفهای مانند Git و GitHub است. تفاوتها بهصورت خطبهخط و کاراکتربهکاراکتر با رنگبندی مشخص نمایش داده میشوند. تمام پردازشها در مرورگر شما انجام میشود و هیچ اطلاعاتی به سرور ارسال نمیگردد. .diff-tool { max-width: 1000px; margin: 30px auto; direction: rtl; font-family: 'Estedad', 'Vazirmatn', Tahoma, sans-serif; background: #ffffff; border-radius: 16px; box-shadow: 0 4px 24px rgba(0,0,0,0.08); padding: 30px; box-sizing: border-box; line-height: 1.7; } .diff-tool * { box-sizing: border-box; font-family: inherit; } .diff-tool h3 { font-size: 1.5rem; color: #1a1a2e; margin: 0 0 8px 0; text-align: center; font-weight: 700; } .diff-tool .subtitle { text-align: center; color: #6b7280; font-size: 1rem; margin-bottom: 24px; } .diff-tool .input-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 16px; } .diff-tool .io-box label { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; font-weight: 600; color: #374151; font-size: 1rem; } .diff-tool .io-box label .char-count { font-size: 1rem; color: #9ca3af; font-weight: 500; } .diff-tool textarea { width: 100%; min-height: 220px; padding: 14px 16px; border: 2px solid #e5e7eb; border-radius: 12px; font-size: 1rem; font-family: inherit; resize: vertical; transition: border-color 0.3s, box-shadow 0.3s; background: #f9fafb; color: #1a1a2e; line-height: 1.9; word-break: break-word; } .diff-tool textarea:focus { outline: none; border-color: #6366f1; box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.15); background: #fff; } .diff-tool textarea::placeholder { color: #9ca3af; } .diff-tool .textarea-1 { border-right: 4px solid #ef4444; } .diff-tool .textarea-2 { border-right: 4px solid #10b981; } .diff-tool .options-bar { display: flex; gap: 16px; flex-wrap: wrap; justify-content: center; align-items: center; background: #f9fafb; padding: 12px 16px; border-radius: 12px; margin-bottom: 16px; border: 1px solid #e5e7eb; } .diff-tool .options-bar label { display: flex; align-items: center; gap: 6px; font-size: 1rem; color: #374151; font-weight: 600; cursor: pointer; margin-bottom: 0; } .diff-tool .options-bar input[type="checkbox"] { width: 18px; height: 18px; accent-color: #6366f1; cursor: pointer; } .diff-tool .controls { display: flex; gap: 10px; justify-content: center; flex-wrap: wrap; margin-bottom: 20px; } .diff-tool .ctrl-btn { padding: 12px 28px; border: none; border-radius: 10px; font-size: 1rem; font-weight: 700; cursor: pointer; transition: all 0.3s; font-family: inherit; min-width: 130px; } .diff-tool .btn-compare { background: linear-gradient(135deg, #6366f1, #4f46e5); color: #fff; } .diff-tool .btn-compare:hover { transform: translateY(-2px); box-shadow: 0 8px 20px rgba(99,102,241,0.35); } .diff-tool .btn-swap { background: #f3f4f6; color: #374151; border: 2px solid #e5e7eb; } .diff-tool .btn-swap:hover { background: #e5e7eb; } .diff-tool .btn-clear { background: #fef2f2; color: #dc2626; border: 2px solid #fecaca; } .diff-tool .btn-clear:hover { background: #fee2e2; } .diff-tool .stats-bar { display: none; grid-template-columns: 1fr 1fr 1fr; gap: 12px; margin-bottom: 16px; } .diff-tool .stats-bar.show { display: grid; } .diff-tool .stat-card { background: #fff; border-radius: 12px; padding: 14px 10px; text-align: center; border: 2px solid #e5e7eb; transition: transform 0.3s; } .diff-tool .stat-card:hover { transform: translateY(-2px); } .diff-tool .stat-card.added { border-color: #bbf7d0; background: #f0fdf4; } .diff-tool .stat-card.removed { border-color: #fecaca; background: #fef2f2; } .diff-tool .stat-card.unchanged { border-color: #d1d5db; background: #f9fafb; } .diff-tool .stat-card .stat-num { font-size: 1.4rem; font-weight: 800; direction: ltr; unicode-bidi: embed; } .diff-tool .stat-card.added .stat-num { color: #16a34a; } .diff-tool .stat-card.removed .stat-num { color: #dc2626; } .diff-tool .stat-card.unchanged .stat-num { color: #6b7280; } .diff-tool .stat-card .stat-lbl { font-size: 1rem; color: #6b7280; font-weight: 600; margin-top: 4px; } .diff-tool .view-mode-bar { display: none; gap: 8px; justify-content: center; margin-bottom: 16px; flex-wrap: wrap; } .diff-tool .view-mode-bar.show { display: flex; } .diff-tool .view-btn { padding: 8px 18px; border: 2px solid #e5e7eb; border-radius: 10px; background: #fff; color: #374151; font-size: 1rem; font-weight: 600; cursor: pointer; transition: all 0.3s; font-family: inherit; } .diff-tool .view-btn:hover { border-color: #6366f1; color: #6366f1; } .diff-tool .view-btn.active { background: #6366f1; border-color: #6366f1; color: #fff; } .diff-tool .result-section { display: none; margin-top: 20px; animation: diff-fadeIn 0.4s ease; } .diff-tool .result-section.show { display: block; } .diff-tool .diff-view { background: #f9fafb; border: 2px solid #e5e7eb; border-radius: 12px; overflow: hidden; max-height: 600px; overflow-y: auto; direction: ltr; } .diff-tool .diff-view.rtl { direction: rtl; } .diff-tool .diff-line { display: flex; align-items: stretch; border-bottom: 1px solid #f3f4f6; font-family: 'Estedad', 'Estedad', monospace; font-size: 1rem; line-height: 1.7; transition: background 0.2s; } .diff-tool .diff-line:last-child { border-bottom: none; } .diff-tool .diff-line .line-num { min-width: 46px; padding: 6px 10px; background: #f3f4f6; color: #9ca3af; text-align: center; font-weight: 600; font-size: 1rem; flex-shrink: 0; user-select: none; border-right: 1px solid #e5e7eb; } .diff-tool .diff-line .line-content { flex: 1; padding: 6px 14px; white-space: pre-wrap; word-break: break-word; color: #1a1a2e; } .diff-tool .diff-line.added { background: #f0fdf4; } .diff-tool .diff-line.added .line-content { color: #166534; } .diff-tool .diff-line.added .line-num { background: #dcfce7; color: #16a34a; } .diff-tool .diff-line.removed { background: #fef2f2; } .diff-tool .diff-line.removed .line-content { color: #991b1b; text-decoration: line-through; text-decoration-color: rgba(220, 38, 38, 0.4); } .diff-tool .diff-line.removed .line-num { background: #fee2e2; color: #dc2626; } .diff-tool .diff-line.unchanged { background: #fff; } .diff-tool .diff-line .marker { display: inline-block; width: 20px; text-align: center; font-weight: 800; font-size: 1rem; margin-left: 4px; } .diff-tool .diff-line.added .marker { color: #16a34a; } .diff-tool .diff-line.removed .marker { color: #dc2626; } .diff-tool .char-highlight { border-radius: 3px; padding: 0 2px; } .diff-tool .char-highlight.add { background: #bbf7d0; color: #14532d; font-weight: 600; } .diff-tool .char-highlight.remove { background: #fecaca; color: #7f1d1d; font-weight: 600; text-decoration: line-through; } .diff-tool .empty-state { text-align: center; padding: 40px 20px; color: #6b7280; font-size: 1rem; } .diff-tool .empty-state .empty-icon { font-size: 3rem; margin-bottom: 10px; opacity: 0.6; } .diff-tool .action-row { display: flex; gap: 8px; justify-content: center; margin-top: 12px; flex-wrap: wrap; } .diff-tool .mini-action { padding: 8px 18px; background: #fff; color: #374151; border: 2px solid #e5e7eb; border-radius: 10px; font-size: 1rem; font-weight: 600; cursor: pointer; transition: all 0.3s; font-family: inherit; } .diff-tool .mini-action:hover { background: #6366f1; border-color: #6366f1; color: #fff; } .diff-tool .mini-action.copied { background: #16a34a; border-color: #16a34a; color: #fff; } @keyframes diff-fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } @media (max-width: 700px) { .diff-tool { padding: 20px 14px; margin: 16px auto; } .diff-tool h3 { font-size: 1.2rem; } .diff-tool .input-grid { grid-template-columns: 1fr; } .diff-tool textarea { min-height: 150px; font-size: 1rem; } .diff-tool .stats-bar { grid-template-columns: 1fr; } .diff-tool .ctrl-btn { padding: 10px 20px; font-size: 1rem; min-width: 110px; } .diff-tool .diff-line { font-size: 1rem; } .diff-tool .diff-line .line-num { min-width: 38px; padding: 6px 6px; font-size: 1rem; } .diff-tool .diff-line .line-content { padding: 6px 8px; } } 🔍 مقایسه دو متن آنلاین تفاوتهای بین دو متن را بهصورت بصری و دقیق پیدا کنید 📄 متن اول (اصلی) ۰ کاراکتر 📝 متن دوم (مقایسه) ۰ کاراکتر نادیده گرفتن حروف بزرگ/کوچک نادیده گرفتن فاصلههای اضافی مقایسه کاراکتربهکاراکتر 🔍 مقایسه متنها ⇄ جابهجایی 🗑️ پاک کردن ۰ ➕ خطوط اضافهشده ۰ ➖ خطوط حذفشده ۰ ✅ خطوط یکسان نمایش همه فقط تفاوتها نمای یکپارچه 📋 کپی نتیجه ⬇️ دانلود گزارش (function() { 'use strict'; var diffData = []; var currentView = 'all'; var isRtl = false; function toFa(num) { return num.toString().replace(/\d/g, function(d) { return '۰۱۲۳۴۵۶۷۸۹'[d]; }); } // تشخیص راستچین بودن متن function detectRtl(text) { var persianRegex = /[\u0600-\u06FF\uFB50-\uFDFF\uFE70-\uFEFF]/; var firstChars = text.substring(0, 200); var persianCount = (firstChars.match(persianRegex) || []).length; return persianCount > 5; } // ============ الگوریتم LCS برای مقایسه دو خط ============ function computeLCS(a, b) { var m = a.length, n = b.length; var dp = []; for (var i = 0; i = dp[i3][j3 - 1]) { result.unshift({ type: 'delete', a: a[i3 - 1] }); i3--; } else { result.unshift({ type: 'insert', b: b[j3 - 1] }); j3--; } } while (i3 > 0) { result.unshift({ type: 'delete', a: a[i3 - 1] }); i3--; } while (j3 > 0) { result.unshift({ type: 'insert', b: b[j3 - 1] }); j3--; } return result; } // ============ مقایسه دو خط ============ function lineDiff(line1, line2, charLevel, ignoreCase) { if (line1 === line2) return { type: 'equal', html: escapeHtml(line1) }; if (!charLevel) { return { type: 'changed', html: '' + escapeHtml(line1) + ' ' + '' + escapeHtml(line2) + '' }; } var a = line1.split(''); var b = line2.split(''); if (ignoreCase) { a = a.map(function(c) { return c.toLowerCase(); }); b = b.map(function(c) { return c.toLowerCase(); }); } var lcs = computeLCS(a, b); // ساخت HTML با رنگبندی var html1 = ''; var html2 = ''; var i = 0; for (var k = 0; k < lcs.length; k++) { var op = lcs[k]; if (op.type === 'equal') { html1 += escapeHtml(line1[i] || ''); html2 += escapeHtml(line2[i] || ''); i++; } else if (op.type === 'delete') { html1 += '' + escapeHtml(op.a) + ''; } else if (op.type === 'insert') { html2 += '' + escapeHtml(op.b) + ''; } } // اضافه کردن کاراکترهای باقیمانده for (var j = i; j < line1.length; j++) { html1 += '' + escapeHtml(line1[j]) + ''; } for (var j2 = i; j2 < line2.length; j2++) { html2 += '' + escapeHtml(line2[j2]) + ''; } return { type: 'changed', html1: html1, html2: html2, original1: line1, original2: line2 }; } function escapeHtml(text) { if (!text) return ''; return text .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } // ============ مقایسه کلی دو متن ============ function diffCompare() { var text1 = document.getElementById('diffText1').value; var text2 = document.getElementById('diffText2').value; var ignoreCase = document.getElementById('diffIgnoreCase').checked; var ignoreWhitespace = document.getElementById('diffIgnoreWhitespace').checked; var charLevel = document.getElementById('diffCharLevel').checked; if (!text1 && !text2) { alert('لطفاً حداقل یکی از متنها را وارد کنید.'); return; } // نرمالسازی function normalize(text) { var lines = text.split('\n'); if (ignoreWhitespace) { lines = lines.map(function(l) { return l.replace(/\s+/g, ' ').trim(); }); } return lines; } var lines1 = normalize(text1); var lines2 = normalize(text2); // مقایسه سطح خط با LCS var compareA = lines1.map(function(l) { return ignoreCase ? l.toLowerCase() : l; }); var compareB = lines2.map(function(l) { return ignoreCase ? l.toLowerCase() : l; }); var lineLcs = computeLCS(compareA, compareB); // ساخت آرایه نتیجه diffData = []; var i1 = 0, i2 = 0; var added = 0, removed = 0, unchanged = 0; for (var k = 0; k < lineLcs.length; k++) { var op = lineLcs[k]; if (op.type === 'equal') { diffData.push({ type: 'unchanged', line1: lines1[i1] !== undefined ? lines1[i1] : '', line2: lines2[i2] !== undefined ? lines2[i2] : '', num1: i1 + 1, num2: i2 + 1 }); i1++; i2++; unchanged++; } else if (op.type === 'delete') { diffData.push({ type: 'removed', line1: lines1[i1] !== undefined ? lines1[i1] : '', num1: i1 + 1, num2: '' }); i1++; removed++; } else if (op.type === 'insert') { diffData.push({ type: 'added', line2: lines2[i2] !== undefined ? lines2[i2] : '', num1: '', num2: i2 + 1 }); i2++; added++; } } // محاسبه تغییرات درونخطی برای خطوط تغییر یافته // (ادغام خطوط حذفشده و اضافهشده مجاور) var finalData = []; var idx = 0; while (idx < diffData.length) { if (diffData[idx].type === 'removed') { // بررسی اینکه آیا بلافاصله بعدش added هست var removedGroup = []; var addedGroup = []; while (idx < diffData.length && diffData[idx].type === 'removed') { removedGroup.push(diffData[idx]); idx++; } while (idx < diffData.length && diffData[idx].type === 'added') { addedGroup.push(diffData[idx]); idx++; } // اگر تعدادشان برابر بود، بهعنوان تغییر درونخطی نمایش بده var minLen = Math.min(removedGroup.length, addedGroup.length); for (var m = 0; m < minLen; m++) { var lineResult = lineDiff( removedGroup[m].line1, addedGroup[m].line2, charLevel, ignoreCase ); finalData.push({ type: 'changed', line1: removedGroup[m].line1, line2: addedGroup[m].line2, num1: removedGroup[m].num1, num2: addedGroup[m].num2, html1: lineResult.html1 || escapeHtml(removedGroup[m].line1), html2: lineResult.html2 || escapeHtml(addedGroup[m].line2) }); } // باقیماندهها for (var r = minLen; r < removedGroup.length; r++) { finalData.push(removedGroup[r]); } for (var a = minLen; a < addedGroup.length; a++) { finalData.push(addedGroup[a]); } } else { finalData.push(diffData[idx]); idx++; } } diffData = finalData; // تشخیص RTL isRtl = detectRtl(text1 + text2); // نمایش آمار document.getElementById('statAdded').textContent = toFa(added); document.getElementById('statRemoved').textContent = toFa(removed); document.getElementById('statUnchanged').textContent = toFa(unchanged); document.getElementById('diffStats').classList.add('show'); document.getElementById('diffViewModes').classList.add('show'); document.getElementById('diffResult').classList.add('show'); renderDiffView(); } // ============ نمایش نتیجه ============ function renderDiffView() { var view = document.getElementById('diffView'); view.innerHTML = ''; view.classList.toggle('rtl', isRtl); var filtered = diffData; if (currentView === 'only') { filtered = diffData.filter(function(item) { return item.type !== 'unchanged'; }); } if (filtered.length === 0) { view.innerHTML = '✨هیچ تفاوتی پیدا نشد! متنها کاملاً یکسان هستند.'; return; } if (currentView === 'unified') { renderUnifiedView(view, filtered); } else { renderSideBySideView(view, filtered); } } // نمایش کنار هم (Side by Side) function renderSideBySideView(view, data) { data.forEach(function(item) { var lineClass = item.type === 'unchanged' ? 'unchanged' : item.type === 'added' ? 'added' : item.type === 'removed' ? 'removed' : 'unchanged'; // خط اول (یا خط حذفشده) if (item.type === 'added') { // فقط در سمت دوم نمایش داده میشود var el = document.createElement('div'); el.className = 'diff-line added'; el.innerHTML = '' + (item.num1 || '') + '' + ' ' + '' + (item.num2 || '') + '' + '+' + (item.line2 || '') + ''; view.appendChild(el); } else if (item.type === 'removed') { // فقط در سمت اول نمایش داده میشود var el2 = document.createElement('div'); el2.className = 'diff-line removed'; el2.innerHTML = '' + (item.num1 || '') + '' + '−' + (item.line1 || '') + '' + '' + (item.num2 || '') + '' + ' '; view.appendChild(el2); } else if (item.type === 'changed') { // خط تغییر یافته var el3 = document.createElement('div'); el3.className = 'diff-line removed'; el3.innerHTML = '' + (item.num1 || '') + '' + '−' + (item.html1 || '') + '' + '' + (item.num2 || '') + '' + ' '; view.appendChild(el3); var el4 = document.createElement('div'); el4.className = 'diff-line added'; el4.innerHTML = '' + ' ' + '' + (item.num2 || '') + '' + '+' + (item.html2 || '') + ''; view.appendChild(el4); } else { // خط یکسان var el5 = document.createElement('div'); el5.className = 'diff-line unchanged'; el5.innerHTML = '' + (item.num1 || '') + '' + ' ' + (item.line1 || '') + '' + '' + (item.num2 || '') + '' + ' ' + (item.line2 || '') + ''; view.appendChild(el5); } }); } // نمایش یکپارچه (Unified) function renderUnifiedView(view, data) { data.forEach(function(item) { if (item.type === 'added') { var el = document.createElement('div'); el.className = 'diff-line added'; el.innerHTML = '' + '+' + (item.line2 || '') + ''; view.appendChild(el); } else if (item.type === 'removed') { var el2 = document.createElement('div'); el2.className = 'diff-line removed'; el2.innerHTML = '' + (item.num1 || '') + '' + '−' + (item.line1 || '') + ''; view.appendChild(el2); } else if (item.type === 'changed') { var el3 = document.createElement('div'); el3.className = 'diff-line removed'; el3.innerHTML = '' + (item.num1 || '') + '' + '−' + (item.html1 || '') + ''; view.appendChild(el3); var el4 = document.createElement('div'); el4.className = 'diff-line added'; el4.innerHTML = '' + (item.num2 || '') + '' + '+' + (item.html2 || '') + ''; view.appendChild(el4); } else { var el5 = document.createElement('div'); el5.className = 'diff-line unchanged'; el5.innerHTML = '' + (item.num1 || '') + '' + ' ' + (item.line1 || '') + ''; view.appendChild(el5); } }); } // ============ تغییر حالت نمایش ============ function diffSetView(mode) { currentView = mode; var btns = document.querySelectorAll('.diff-tool .view-btn'); for (var i = 0; i < btns.length; i++) { btns[i].classList.toggle('active', btns[i].getAttribute('data-view') === mode); } renderDiffView(); } // ============ جابهجایی ============ function diffSwap() { var t1 = document.getElementById('diffText1'); var t2 = document.getElementById('diffText2'); var tmp = t1.value; t1.value = t2.value; t2.value = tmp; updateCounts(); if (document.getElementById('diffResult').classList.contains('show')) { diffCompare(); } } // ============ پاک کردن ============ function diffClear() { if (!confirm('آیا مطمئن هستید که میخواهید همه متنها را پاک کنید؟')) return; document.getElementById('diffText1').value = ''; document.getElementById('diffText2').value = ''; document.getElementById('diffResult').classList.remove('show'); document.getElementById('diffStats').classList.remove('show'); document.getElementById('diffViewModes').classList.remove('show'); updateCounts(); diffData = []; } // ============ شمارنده کاراکتر ============ function updateCounts() { var t1 = document.getElementById('diffText1'); var t2 = document.getElementById('diffText2'); document.getElementById('text1Count').textContent = toFa(t1.value.length) + ' کاراکتر'; document.getElementById('text2Count').textContent = toFa(t2.value.length) + ' کاراکتر'; } // ============ کپی نتیجه ============ function diffCopyResult() { if (diffData.length === 0) return; var text = ''; diffData.forEach(function(item) { if (item.type === 'unchanged') { text += ' ' + item.line1 + '\n'; } else if (item.type === 'removed') { text += '− ' + item.line1 + '\n'; } else if (item.type === 'added') { text += '+ ' + item.line2 + '\n'; } else if (item.type === 'changed') { text += '− ' + item.line1 + '\n'; text += '+ ' + item.line2 + '\n'; } }); var btn = document.getElementById('diffCopyBtn'); if (navigator.clipboard) { navigator.clipboard.writeText(text).then(function() { btn.textContent = '✅ کپی شد'; btn.classList.add('copied'); setTimeout(function() { btn.textContent = '📋 کپی نتیجه'; btn.classList.remove('copied'); }, 2000); }); } } // ============ دانلود گزارش ============ function diffDownloadResult() { if (diffData.length === 0) return; var text = 'گزارش مقایسه متن - TookaPlus.ir\n'; text += '====================================\n\n'; text += 'تعداد خطوط اضافهشده: ' + document.getElementById('statAdded').textContent + '\n'; text += 'تعداد خطوط حذفشده: ' + document.getElementById('statRemoved').textContent + '\n'; text += 'تعداد خطوط یکسان: ' + document.getElementById('statUnchanged').textContent + '\n'; text += '\n====================================\n\n'; diffData.forEach(function(item) { if (item.type === 'unchanged') { text += ' ' + item.line1 + '\n'; } else if (item.type === 'removed') { text += '− ' + item.line1 + '\n'; } else if (item.type === 'added') { text += '+ ' + item.line2 + '\n'; } else if (item.type === 'changed') { text += '− ' + item.line1 + '\n'; text += '+ ' + item.line2 + '\n'; } }); var blob = new Blob([text], { type: 'text/plain;charset=utf-8' }); var link = document.createElement('a'); link.download = 'diff-report-' + Date.now() + '.txt'; link.href = URL.createObjectURL(blob); document.body.appendChild(link); link.click(); document.body.removeChild(link); } // ============ راهاندازی ============ window.diffCompare = diffCompare; window.diffSwap = diffSwap; window.diffClear = diffClear; window.diffSetView = diffSetView; window.diffCopyResult = diffCopyResult; window.diffDownloadResult = diffDownloadResult; function init() { var t1 = document.getElementById('diffText1'); var t2 = document.getElementById('diffText2'); if (t1) t1.addEventListener('input', updateCounts); if (t2) t2.addEventListener('input', updateCounts); // Ctrl+Enter برای مقایسه [t1, t2].forEach(function(el) { if (el) el.addEventListener('keydown', function(e) { if (e.ctrlKey && e.key === 'Enter') { e.preventDefault(); diffCompare(); } }); }); updateCounts(); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })(); چرا به مقایسه دو متن نیاز داریم؟ وکلا و کارشناسان حقوقی: مقایسه نسخههای مختلف قرارداد و شناسایی تغییرات نویسندگان و ویراستاران: بررسی تغییرات بین پیشنویسها و نسخههای نهایی برنامهنویسان: مقایسه کدهای قبلی و جدید برای پیدا کردن باگها دانشجویان و محققان: مقایسه مقالات و بررسی سرقت علمی مدیران محتوا: بررسی تغییرات مقالات قبل و بعد از ویرایش مترجمان: مقایسه متن اصلی و ترجمه برای اطمینان از صحت ویژگیهای کلیدی ابزار مقایسه خطبهخط با نمایش خطوط اضافه، حذف و تغییر یافته مقایسه کاراکتربهکاراکتر برای پیدا کردن تفاوتهای جزئی رنگبندی حرفهای: سبز برای اضافهشده، قرمز برای حذفشده، زرد برای تغییرات نمایش شماره خطوط برای مرجعدهی سریع حالتهای نمایش: کنار هم، یکپارچه و فقط تفاوتها نادیده گرفتن فاصلهها و حروف بزرگ/کوچک (اختیاری) آمار کامل: تعداد خطوط اضافه، حذف و تغییر کپی یا دانلود نتیجه برای نگهداری پشتیبانی کامل از متن فارسی و انگلیسی طراحی واکنشگرا و سازگار با موبایل و دسکتاپ پردازش کامل در مرورگر — بدون ارسال داده به سرور سوالات متداول (FAQ) ۱. الگوریتم LCS چیست؟LCS یا Longest Common Subsequence یک الگوریتم استاندارد برای پیدا کردن طولانیترین دنباله مشترک بین دو متن است. این الگوریتم پایهای برای ابزارهای مقایسه حرفهای مانند Git Diff، GitHub و Beyond Compare است. ۲. تفاوت مقایسه خطبهخط و کاراکتربهکاراکتر چیست؟ خطبهخط: کل خط را بهعنوان یک واحد در نظر میگیرد و نشان میدهد کدام خطوط اضافه، حذف یا تغییر یافتهاند. کاراکتربهکاراکتر: حتی تفاوتهای کوچک در یک خط را نیز نشان میدهد و مفیدتر است. ۳. آیا میتوانم متنهای طولانی را مقایسه کنم؟بله، این ابزار از متنهای کوتاه تا متنهای چند هزار خطی پشتیبانی میکند. برای متون بسیار طولانی، ممکن است کمی زمان ببرد. ۴. تفاوتها چگونه رنگبندی میشوند؟ سبز: خطوط یا بخشهایی که به متن دوم اضافه شدهاند قرمز: خطوط یا بخشهایی که از متن اول حذف شدهاند زرد: بخشهایی که تغییر کردهاند ۵. آیا امکان ذخیره نتیجه وجود دارد؟بله، میتوانید نتیجه مقایسه را کپی کنید یا بهصورت فایل متنی دانلود کنید. ۶. آیا اطلاعات من ذخیره میشود؟خیر، تمام پردازشها در مرورگر شما انجام میشود و هیچ اطلاعاتی به سرور ارسال نمیگردد. نتیجهگیری مقایسه دو متن آنلاین ابزاری ضروری برای هر کسی است که با متن، قرارداد، کد یا مقاله سر و کار دارد. با استفاده از این ابزار میتوانید در چند ثانیه تمام تفاوتهای بین دو متن را بهصورت بصری و دقیق مشاهده کنید و از تغییرات آگاه شوید. همین امروز امتحان کنید!