首页 php教程 PHP源码 [原创]HTML Diff,php版本,文本对比(标记出两个HTML的差异)

[原创]HTML Diff,php版本,文本对比(标记出两个HTML的差异)

May 25, 2016 pm 05:11 PM

                  

           

3. [代码][JavaScript]代码     跳至                                       

/*
 * Compare str
 * @example var result = htmldiff.compare('str1','str2');
 * 
 * 
 */
var htmldiff = {
	MODE_CHARACTER: 1,MODE_TAG: 2,MODE_WHITESPACE: 3,
	ACTION_EQUAL: 1,ACTION_DELETE: 2,ACTION_INSERT: 3,ACTION_NONE: 4,ACTION_REPLACE: 5,
	specialCaseOpeningTags: new Array('\\s]+', '\\s]+', '\\s]+', '\\s]+', '\\s]+', '\\s]+', '\\s]+', '\\s]+', '\\s]+', '\\s]+'),
	specialCaseClosingTags: new Array('', '', '', '', '', '', '', '', '', ''),
	content: '',
	wordIndices: '',
	oldWords: '',newWords: '',
	compare: function(str1, str2) {
		this.content = new Array();
		this.wordIndices = new Array();
		this.oldWords = this.ConvertHtmlToListOfWords(str1);
		this.newWords = this.ConvertHtmlToListOfWords(str2);
		this.wordIndices = this.IndexNewWords(this.newWords);
		var b = this.Operations();
		for (var c = 0; c < b.length; c++) {
			var d = b[c];
			this.PerformOperation(d);
		}
		return this.content.join(&#39;&#39;);
	},
	Operations: function() {
		var d = 0;
		var j = 0;
		var a = new Array();
		var f = this.MatchingBlocks();
		f.push(this.Match(this.oldWords.length, this.newWords.length, 0));
		for (var i = 0; i < f.length; i++) {
			var g = f[i];
			var b = (d == g.StartInOld);
			var h = (j == g.StartInNew);
			var c = this.ACTION_NONE;
			if (b == false && h == false)
				c = this.ACTION_REPLACE;
			else {
				if (b == true && h == false)
					c = this.ACTION_INSERT;
				else {
					if (b == false && h == true)
						c = this.ACTION_DELETE;
					else
						c = this.ACTION_NONE;
				}
			}
			if (c != this.ACTION_NONE)
				a.push(this.Operation(c, d, g.StartInOld, j, g.StartInNew));
			if (g.length != 0)
				a.push(this.Operation(this.ACTION_EQUAL, g.StartInOld, g.EndInOld(), g.StartInNew, g.EndInNew()));
			d = g.EndInOld();
			j = g.EndInNew();
		}
		return a;
	},
	MatchingBlocks: function() {
		var a = new Array();
		this.FindMatchingBlocks(0, this.oldWords.length, 0, this.newWords.length, a);
		return a;
	},
	FindMatchingBlocks: function(c, b, f, e, d) {
		var a = this.FindMatch(c, b, f, e);
		if (a != null) {
			if (c < a.StartInOld && f < a.StartInNew)
				this.FindMatchingBlocks(c, a.StartInOld, f, a.StartInNew, d);
			d.push(a);
			if (a.EndInOld() < b && a.EndInNew() < e)
				this.FindMatchingBlocks(a.EndInOld(), b, a.EndInNew(), e, d);
		}
	},
	FindMatch: function(l, e, b, k) {
		var f = l;
		var m = b;
		var n = 0;
		var c = new Array();
		for (var i = l; i < e; i++) {
			var d = new Array();
			var h = this.oldWords[i];
			if (!this.wordIndices[h]) {
				c = d;
				continue;
			}
			for (var g = 0; g < this.wordIndices[h].length; g++) {
				var a = this.wordIndices[h][g];
				if (a < b) continue;
				if (a >= k) break;

				newMatchLength = (c[a - 1] ? c[a - 1] : 0) + 1;
				d[a] = newMatchLength;
				if (newMatchLength > n) {
					f = i - newMatchLength + 1;
					m = a - newMatchLength + 1;
					n = newMatchLength;
				}
			}
			c = d;
		}
		return n != 0 ? this.Match(f, m, n) : null;
	},
	IndexNewWords: function(d) {
		var b = new Array();
		for (var i = 0; i < d.length; i++) {
			var c = d[i];
			if (b[c])
				b[c].push(i);
			else
				b[c] = [i];
		}
		return b;
	},
	ConvertHtmlToListOfWords: function(b) {
		var f = this.MODE_CHARACTER;
		var e = &#39;&#39;;
		var d = new Array();
		for (var i = 0; i < b.length; i++) {
			var c = b[i];
			switch (f) {
			case this.MODE_CHARACTER:
				if (this.IsStartOfTag(c)) {
					if (e)
						d.push(e);
					e = &#39;<&#39;;
					f = this.MODE_TAG;
				} else {
					if (this.IsWhiteSpace(c)) {
						if (e)
							d.push(e);
						e = c;
						f = this.MODE_WHITESPACE;
					} else {console.log(e );
						if (this.isNaW(e + c)) {
							if (e)
								d.push(e);
							e = c;
						} else
							e = e + c;
					}
				}
				break;
			case this.MODE_TAG:
				if (this.IsEndOfTag(c)) {
					e = e + &#39;>&#39;;
					d.push(e);
					e = &#39;&#39;;
					if (this.IsWhiteSpace(c))
						f = this.MODE_WHITESPACE;
					else
						f = this.MODE_CHARACTER;
				} else
					e = e + c;
				break;
			case this.MODE_WHITESPACE:
				if (this.IsStartOfTag(c)) {
					if (e)
						d.push(e);
					e = &#39;<&#39;;
					f = this.MODE_TAG;
				} else {
					if (this.IsWhiteSpace(c))
						e = e + c;
					else {
						if (e)
							d.push(e);
						e = c;
						f = this.MODE_CHARACTER;
					}
				}
				break;
			default:
				break;
			}
		}
		if (e)
			d.push(e);
		return d;
	},
	PerformOperation: function(a) {
		switch (a.Action) {
		case this.ACTION_EQUAL:
			this.ProcessEqualOperation(a);
			break;
		case this.ACTION_DELETE:
			this.ProcessDeleteOperation(a, &#39;diffdel&#39;);
			break;
		case this.ACTION_INSERT:
			this.ProcessInsertOperation(a, &#39;diffins&#39;);
			break;
		case this.ACTION_NONE:
			break;
		case this.ACTION_REPLACE:
			this.ProcessReplaceOperation(a);
			break;
		default:
			break;
		}
	},
	ProcessReplaceOperation: function(a) {
		this.ProcessDeleteOperation(a, &#39;diffmod&#39;);
		this.ProcessInsertOperation(a, &#39;diffmod&#39;);
	},
	ProcessInsertOperation: function(b, a) {
		var c = this.array_slice(this.newWords, b.StartInNew, b.EndInNew);
		this.InsertTag(&#39;ins&#39;, a, c);
	},
	ProcessDeleteOperation: function(b, a) {
		var c = this.array_slice(this.oldWords, b.StartInOld, b.EndInOld);
		this.InsertTag(&#39;del&#39;, a, c);
	},
	ProcessEqualOperation: function(b) {
		var a = this.array_slice(this.newWords, b.StartInNew, b.EndInNew);
		this.content.push(a.join(&#39;&#39;));
	},
	preg_match_array: function(b, e) {
		var a = 0;
		for (var i = 0; i < b.length; i++)
			a |= (new RegExp(b[i])).test(e);
		return a;
	},
	InsertTag: function(j, h, f) {
		while (true) {
			if (f.length == 0) break;

			var b = this.ExtractConsecutiveWords(f, false);
			var c = b.items;
			f = b.words;
			var a = &#39;&#39;;
			var e = false;
			if (c.length != 0) {
				var g = this.WrapText(c.join(&#39;&#39;), j, h);
				this.content.push(g);
			} else {
				if ( !! this.preg_match_array(this.specialCaseOpeningTags, f[0])) {
					a = &#39;&#39;;
					if (j == &#39;del&#39;)
						f.shift();
				} else {
					if (this.in_array(f[0], this.specialCaseClosingTags)) {
						a = &#39;&#39;;
						e = true;
						if (j == &#39;del&#39;)
							f.shift();
					}
				}
			}
			if (f.length == 0 && a.length == 0) break;
			if (e) {
				var d = this.ExtractConsecutiveWords(f, true);
				f = d.words;
				this.content.push(a + d.items.join(&#39;&#39;));
			} else {
				var d = this.ExtractConsecutiveWords(f, true);
				f = d.words;
				this.content.push(d.items.join(&#39;&#39;) + a);
			}
		}
	},
	in_array: function(b, c) {
		for (var i = 0; i < c.length; i++) {
			if (c[i] == b)
				return true;
		}
		return false;
	},
	WrapText: function(c, b, a) {
		return &#39;<&#39; + b + &#39; class="&#39; + a + &#39;">&#39; + c + &#39;&#39;;
	},
	ExtractConsecutiveWords: function(d, f) {
		var e = false;
		for (var b = 0; b < d.length; b++) {
			var c = d[b];
			if (f ? !this.IsTag(c) : !!this.IsTag(c)) {
				e = b;
				break;
			}
		}
		if (e !== false) {
			var a = this.array_slice(d, 0, e);
			if (e > 0)
				d.splice(0, e);
			return {items: a,words: d};
		} else {
			a = d;
			d = new Array();
			return {items: a,words: d};
		}
	},
	IsTag: function(b) {
		var a = this.IsOpeningTag(b) || this.IsClosingTag(b);
		return a;
	},
	IsOpeningTag: function(a) {
		return /^\s*]+>\s*$/.test(a);
	},
	IsClosingTag: function(a) {
		return /^\s*]+>\s*$/.test(a);
	},
	IsStartOfTag: function(a) {
		return a == "<";
	},
	IsEndOfTag: function(a) {
		return a == ">";
	},
	IsWhiteSpace: function(a) {
		return /\s/.test(a);
	},
	isNaW: function(b) {
		return /[^\x00-\x80]/.test(b);
	},
	array_slice: function(a, b, c, d) {
		return a.slice(b, c);
	},
	Match: function(b, d, a) {
		var c = {
			StartInOld: b,
			StartInNew: d,
			Size: a
		};
		c.EndInOld = function() {
			return b + a;
		};
		c.EndInNew = function() {
			return d + a;
		};
		return c;
	},
	Operation: function(c, b, a, f, d) {
		var e = {
			Action: c,
			StartInOld: b,
			EndInOld: a,
			StartInNew: f,
			EndInNew: d
		};
		return e;
	}
};
登录后复制

           

       

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

php的版本发展历史(1995-2022) php的版本发展历史(1995-2022) Jun 01, 2020 pm 01:59 PM

作为一个php学习和开发者,怎能不了解其历史?下面php中文网带领php爱好者们一起回顾下php各个历史版本。

宝塔面板教程:PHP版本切换简易指南 宝塔面板教程:PHP版本切换简易指南 Mar 05, 2024 am 09:27 AM

宝塔面板是一款功能强大、使用方便的服务器管理面板,可以帮助用户轻松管理网站、数据库、FTP等服务。在使用宝塔面板的过程中,有时候会需要切换PHP版本来适配不同的网站需求。本文将为大家提供一个PHP版本切换的简易指南,同时提供具体的代码示例,以帮助读者快速完成PHP版本切换的操作。首先,我们需要登录宝塔面板,进入网站设置页面。在左侧导航栏找到“网站”选项,并点

宝塔面板操作指南:PHP版本切换技巧分享 宝塔面板操作指南:PHP版本切换技巧分享 Mar 04, 2024 am 10:42 AM

宝塔面板(BTPanel)是一款强大而易用的服务器管理面板,可以帮助用户轻松管理服务器、网站和数据库等服务。作为一名网站开发者或管理员,掌握宝塔面板中PHP版本切换的技巧十分重要。在本文中,将分享如何在宝塔面板中操作、切换PHP版本的方法,并提供具体的代码示例,帮助读者更好地掌握这一技能。1.登录宝塔面板首先,在浏览器中输入服务器IP地址或域名,加上宝塔

了解PHP版本NTS的含义和重要性 了解PHP版本NTS的含义和重要性 Mar 27, 2024 pm 12:15 PM

PHP版本NTS的含义和重要性PHP(HypertextPreprocessor)是一种广泛使用的开源服务器端脚本语言,被用于开发动态网页。PHP的版本包括NTS(Non-ThreadSafe)和TS(ThreadSafe)两种。在本文中,我们将重点讨论NTS版本的含义和重要性,并提供一些具体的代码示例。NTS版本是指PHP的非线程安全版本,其设计初衷

怎样处理PHP版本升级带来的错误 怎样处理PHP版本升级带来的错误 May 11, 2023 am 08:48 AM

在使用PHP开发网站或应用程序时,版本升级是一项必要的工作,因为每个版本都会带来新的功能和修复已知问题。但是,PHP版本升级也会引入新的错误,因为新版本可能不再支持旧版本的功能或语法。在本文中,我们将介绍如何处理PHP版本升级带来的错误,以确保应用程序的正常运行。1.备份应用程序和服务器在进行PHP版本升级之前,必须备份应用程序和服务器。备份应用程序可以在出

Eclipse中如何更新PHP版本 Eclipse中如何更新PHP版本 Mar 28, 2024 pm 09:54 PM

Eclipse是一款广泛使用的集成开发环境(IDE),可以用于开发各种编程语言的项目。在使用Eclipse开发PHP项目时,有时候需要更新PHP版本以适应新功能或者修复bug。本文将介绍如何在Eclipse中更新PHP版本,并提供具体的代码示例。一、更新PHP版本的准备工作在更新PHP版本之前,我们需要确保已经安装了Eclipse以及PHP的开发环境。另外,

PHP函数的版本更新如何影响开发? PHP函数的版本更新如何影响开发? Apr 18, 2024 pm 02:54 PM

PHP函数版本更新的影响:新特性的影响:引入新特性,方便开发复杂任务。修复错误的影响:改进函数行为,提高代码稳定性。行为更改的影响:最具破坏性,需更新使用该函数的代码。最佳实践:在测试环境测试更新、检查交互代码、更新受影响依赖项。

PHP7版本新特性及对小程序开发的影响 PHP7版本新特性及对小程序开发的影响 Jul 04, 2023 pm 06:15 PM

PHP7版本新特性及对小程序开发的影响随着科技的不断发展,互联网行业也日新月异。近年来,小程序成为了移动应用开发的热点话题。与此同时,PHP7版本的发布也成为了开发者们瞩目的焦点。本文将探讨PHP7版本的新特性,并分析它对小程序开发的影响。一、PHP7版本新特性PHP7版本作为PHP语言的重大更新,带来了许多新的特性和性能上的提升。以下是几个重要的新特性:性

See all articles