實現一個簡單的類似Git的橫向對比文件不同的demo

實現一個簡單的類似Git的橫向對比文件不同的demo

思路:首先對於兩個不同的文件夾而言,使用PHP自帶的$_FILE函數可以得到文件的名稱,創建時間,最後修改時間等內容,可以進行對比,若有不同的信息,則將文件夾進行遍歷,並進一步遞歸的進行查詢文件和文件夾信息,找到所有不同的文件之後,仍舊使用PHP自帶的file函數讀取文件內容,讀取的返回結果爲一個鍵值遞增的字符串數組;將同名文件進行逐行對比,若發現不同信息,則可以使用一個flag數組進行標記;遍歷結束之後,輸出兩個文件內容並藉助flag標記標籤標記出不同的行即可

一個簡單的對比文件內容不同的demo實現如下:
<?php
//讀取文件
$ofiledir = "./ofile/";
$nfiledir = "./nfile/";
$readfile1 = file($ofiledir."helloworld.php");
$readfile2 = file($nfiledir."helloworld.php");
$flag = array();
//逐行比較兩個文件內容,並對不同之處藉助$flag數組進行標記
for($i = 0;$i < max(count($readfile1),count($readfile2));$i ++)
{
    if($readfile1[$i] === $readfile2[$i])
    {
        $first[] = $readfile1[$i];
        $second[] = $readfile2[$i];
        $flag[$i] = 0;
    }
    else 
    {
        $first[] = $readfile1[$i];
        $second[] = $readfile2[$i];
        $flag[$i] = 1;
    }
}



//echo count($first);
//var_dump($readfile);

?>

<html>
	<head>
		<title>gitmanage</title>
	</head>
	<style type="text/css">
        .filecontent{
            border:1px solid green;
            width :600px;
        	float:left;
            }
        .blank{
        	border:1px solid green;
        	width :20px;
        	float:left;
        }
	</style>
	<body>
	
	<!-- 輸出原文件 -->
		<div class="filecontent" style="float:left">
		
		<?php 
		for($i = 0;$i < count($first);$i ++)
		{
		?>
        <!-- 使用淺色背景標記發生變化的行內容 -->
		<div class="filecontent" style="<?php if ($flag[$i] == 1) echo "background-color:CCFFCC"?>">
        <!-- 輸出行號 -->
		<div class="blank"><?php echo $i+1;?></div>
        <!-- 輸出佔位符 -->
		<div class="blank">&nbsp</div>
        <!-- 使用script標籤來使輸出的<>之類的標籤內容不會被解釋爲標籤 -->
		<script type="text/html" style='display:block'>
		<?php
		    echo "$first[$i]"."\n"; 
		?>
		</script>
		</div>
		<?php
		    echo "\n";
        }
		?>
		</div>
		

	<!-- 輸出新文件 -->
		<div class="filecontent" style="float:left">
		
		<?php 
		for($i = 0;$i < count($second);$i ++)
		{
		?>
        <!-- 使用淺色背景標記發生變化的行內容 -->
		<div class="filecontent" style="<?php if ($flag[$i] == 1) echo "background-color:CCFFCC"?>">
        <!-- 輸出行號 -->
		<div class="blank"><?php echo $i+1;?></div>
        <!-- 在發生變化的行內容前添加提示 -->
		<div class="blank"><?php if ($flag[$i] == 0) echo "&nbsp"; else echo "+";?></div>
        <!-- 使用script標籤來使輸出的<>之類的標籤內容不會被解釋爲標籤 -->
		<script type="text/html" style='display:block'>
		<?php
		    echo "$second[$i]"."\n"; 
		?>
		</script>
		</div>
		<?php
		    echo "\n";
        }
		?>
		</div>
    
	</body>
</html>

顯示效果如圖:
顯示效果

遇到的困難:

在輸出php文件的時候,無法在html文件中逐行輸出php代碼(或者類似的"<#include>、<html>"標籤),原因如下:

<html>
    <head>
        <title>hello</title>
    </head>
    <body>
    <?php
		echo "<?php";
    	echo "echo 'hello world'";
    	echo "?>";
	?>   
    </body>
   
</\html>
<!--
這段代碼的本意是輸出
    <?php
    echo "hello world";
    ?>
這個代碼段但是,在實際操作中,會將代碼段中的<?php 直接解析,導致輸出結果不理想
-->

解決方法:

使用div將需要輸出的代碼段包裹起來,並在script標籤中設置disblock

解決代碼如下
<?php
$arr = ['hello' => "<?php?>hello",
       	'world' => "<html></html>world",
        'hi' => '<p></p>hi'];
?>
<html>
    <?php
    	foreach($arr as $value)
        {
    ?>
    <script type="text/html" style='display:block'>
    	<?php echo $value; ?>
    </script>
    <?php
        }
    ?>
</html>

標籤不被解析

如上圖所示,html和php着這種標籤並不會被解析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章