Heim > php教程 > php手册 > 使用php比较文本内容的差异

使用php比较文本内容的差异

WBOY
Freigeben: 2016-06-06 19:32:17
Original
2629 Leute haben es durchsucht

这个类可以查找和查看文本字符串之间的差异。 它有两个文本字符串和使用的差异算法来找出它们之间的差异,并返回一个列表的变化,来修补原来的字符串成为最后的字符串。 PHP 源码与演示: 源码出处演示出处 ?php/* *from:http://www.codepearl.com */require(

这个类可以查找和查看文本字符串之间的差异。

它有两个文本字符串和使用的差异算法来找出它们之间的差异,并返回一个列表的变化,来修补原来的字符串成为最后的字符串。 PHP

源码与演示:源码出处 演示出处

使用php比较文本内容的差异
<?php
/*
 *from:http://www.codepearl.com
 */
	require('diff.php');
 
 $before = IsSet($_POST['before']) ? $_POST['before'] : 'Some text before';
 $after = IsSet($_POST['after']) ? $_POST['after'] : 'This is the text after';
 $mode = (IsSet($_POST['mode']) ? $_POST['mode'] : 'w');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<title>Test the Diff Object</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<style type="text/css">
* { font-family: sans-serif,arial,helvetica }
</style>
<body>
<form method="POST" action="?">
<div><label for="before">Before</label><br>
<textarea id="before" cols="80" rows="10" name="before"><?php echo HtmlSpecialChars($before); ?></textarea></div>
<div><label for="after">After</label><br>
<textarea id="after" cols="80" rows="10" name="after"><?php echo HtmlSpecialChars($after); ?></textarea></div>
<div><input type="submit" name="compare" value="Compare"> by <select name="mode">
<option value="c"<?php if($mode === 'c') echo ' selected'; ?>>Character</option>
<option value="w"<?php if($mode === 'w') echo ' selected'; ?>>Word</option>
<option value="l"<?php if($mode === 'l') echo ' selected'; ?>>Line</option>
</select></div>
<?php
	if(IsSet($_POST['compare']))
	{
		$diff = new diff_class;
		$difference = new stdClass;
		$difference->mode = $mode;
		if($diff->FormatDiffAsHtml($before, $after, $difference))
			echo '<div>Difference<br><div style="border-style: solid; border-width: 1px">', $difference->html, '</div></div>';
		else
			echo '<div>Error: ', HtmlSpecialChars($diff->error), '</div>';
	}
?>
</form>
</body>
</html>
Nach dem Login kopieren
<?php
/*
 *from:http://www.codepearl.com
 */

/*
{metadocument}<?xml version="1.0" encoding="ISO-8859-1" ?>
<class>

	<package>http://www.codepearl.com</package>

	<version>@(#) $Id: diff.php,v 1.4 2013/11/06 21:19:07 mlemos Exp $</version>
	<copyright>Copyright ?(C) http://www.codepearl.com</copyright>
	<title>OAuth client</title>
	<author>Manuel Lemos</author>
	<authoraddress>http://www.codepearl.com</authoraddress>

	<documentation>
		<idiom>en</idiom>
		<purpose>.</purpose>
		<usage>.</usage>
	</documentation>

{/metadocument}
*/

class diff_class
{
	var $error = '';
	var $insertedStyle = 'font-weight: bold';
	var $deletedStyle = 'text-decoration: line-through';

	Function SplitString($string, $separators, $end, &$positions)
	{
		$l = strlen($string);
		$split = array();
		for($p = 0; $p < $l;)
		{
			$e = strcspn($string, $separators.$end, $p);
			$e += strspn($string, $separators, $p + $e);
			$split[] = substr($string, $p, $e);
			$positions[] = $p;
			$p += $e;
			if(strlen($end)
			&& ($e = strspn($string, $end, $p)))
			{
				$split[] = substr($string, $p, $e);
				$positions[] = $p;
				$p += $e;
			}
		}
		$positions[] = $p;
		return $split;
	}

/*
{metadocument}
	<function>
		<name>Diff</name>
		<type>BOOLEAN</type>
		<documentation>
			<purpose>.</purpose>
			<usage>.</usage>
		</documentation>
		<argument>
			<name>before</name>
			<type>STRING</type>
			<documentation>
				<purpose>.</purpose>
			</documentation>
		</argument>
		<argument>
			<name>after</name>
			<type>STRING</type>
			<documentation>
				<purpose>.</purpose>
			</documentation>
		</argument>
		<argument>
			<name>difference</name>
			<type>HASH</type>
			<out />
			<documentation>
				<purpose>.</purpose>
			</documentation>
		</argument>
		<do>
{/metadocument}
*/
	Function Diff($before, $after, &$difference)
	{
		$mode = (IsSet($difference->mode) ? $difference->mode : 'c');
		switch($mode)
		{
			case 'c':
				$lb = strlen($before);
				$la = strlen($after);
				break;

			case 'w':
				$before = $this->SplitString($before, " \t", "\r\n", $posb);
				$lb = count($before);
				$after = $this->SplitString($after, " \t", "\r\n", $posa);
				$la = count($after);
				break;

			case 'l':
				$before = $this->SplitString($before, "\r\n", '', $posb);
				$lb = count($before);
				$after = $this->SplitString($after, "\r\n", '', $posa);
				$la = count($after);
				break;

			default:
				$this->error = $mode.' is not a supported more for getting the text differences';
				return false;
		}
		$diff = array();
		for($b = $a = 0; $b < $lb && $a < $la;)
		{
			for($pb = $b; $a < $la && $pb < $lb && $after[$a] === $before[$pb]; ++$a, ++$pb);
			if($pb !== $b)
			{
				$diff[] = array(
					'change'=>'=',
					'position'=>($mode === 'c'  ? $b : $posb[$b]),
					'length'=>($mode === 'c' ? $pb - $b : $posb[$pb] - $posb[$b])
				);
				$b = $pb;
			}
			if($b === $lb)
				break;
			for($pb = $b; $pb < $lb; ++$pb)
			{
				for($pa = $a ; $pa < $la && $after[$pa] !== $before[$pb]; ++$pa);
				if($pa !== $la)
					break;
			}
			if($pb !== $b)
			{
				$diff[] = array(
					'change'=>'-',
					'position'=>($mode === 'c'  ? $b : $posb[$b]),
					'length'=>($mode === 'c' ? $pb - $b : $posb[$pb] - $posb[$b])
				);
				$b = $pb;
			}
			if($pa !== $a)
			{
				$diff[] = array(
					'change'=>'+',
					'position'=>($mode === 'c'  ? $a : $posa[$a]),
					'length'=>($mode === 'c' ? $pa - $a : $posa[$pa] - $posa[$a])
				);
				$a = $pa;
			}
		}
		if($a < $la)
		{
			$diff[] = array(
				'change'=>'+',
				'position'=>($mode === 'c'  ? $a : $posa[$a]),
				'length'=>($mode === 'c' ? $la - $a : $posa[$la] - $posa[$a])
			);
		}
		$difference->difference = $diff;
		return true;
	}
/*
{metadocument}
		</do>
	</function>
{/metadocument}
*/

	Function FormatDiffAsHtml($before, $after, &$difference)
	{
		if(!$this->diff($before, $after, $difference))
		{
			return false;
		}
		$html = '';
		$insertedStyle = (strlen($this->insertedStyle) ? ' style="'.HtmlSpecialChars($this->insertedStyle).'"' : '');
		$deletedStyle = (strlen($this->deletedStyle) ? ' style="'.HtmlSpecialChars($this->deletedStyle).'"' : '');
		$td = count($difference->difference);
		for($d = 0; $d < $td; ++$d)
		{
			$diff = $difference->difference[$d];
			switch($diff['change'])
			{
				case '=':
					$html .= nl2br(HtmlSpecialChars(substr($before, $diff['position'], $diff['length'])));
					break;
				case '-':
					$html .= '<del'.$deletedStyle.'>'.nl2br(HtmlSpecialChars(substr($before, $diff['position'], $diff['length']))).'</del>';
					break;
				case '+':
					$html .= '<ins'.$insertedStyle.'>'.nl2br(HtmlSpecialChars(substr($after, $diff['position'], $diff['length']))).'</ins>';
					break;
				default:
					$this->error = $diff['change'].' is not an expected difference change type';
					return false;
			}
		}
		$difference->html = $html;
		return true;
	}
};

/*

{metadocument}
</class>
{/metadocument}

*/

?>
Nach dem Login kopieren
使用php比较文本内容的差异
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage