2016-07-04 51 views
0

使用PHP我想比較兩個文本文件,第一個文件是另一個應該與它比較的主文件。 如果first.txt線不second.txt存在或者是與之不同,腳本應返回該行的全部塊,例如:使用正則表達式提取文本塊

first.txt

interface Vlan11 
description xxx 
ip address 10.10.10.10 255.255.255.255 
shutdown 
! 
vlan 34 
! 
vlan 17 
name sth 
! 
route-map sth 
match ip address exm 
set ip next-hop 1.2.3.4 
! 

第二。 TXT

interface Vlan11 
description xxx 
ip address 20.20.20.20 255.255.255.255 
shutdown 
! 
vlan 34 
! 
route-map sth 
match ip address exm 
set ip next-hop 1.2.3.4 
! 

對於比較我提取使用的first.txt線,並在second.txt搜索它們,現在的IP地址是在second.txt三線不同,那麼我們應該(從interface到爆炸(!))返回該行的塊:

interface Vlan11 
description xxx 
ip address 20.20.20.20 255.255.255.255 
shutdown 
! 

second.txtvlan塊一個不存在的,所以應該回報:

vlan 17 
name sth 
! 

可以很容易地編寫提取兩個劉海之間的塊一個正則表達式,而是因爲我應該回到塊我不開始不知道模式應該從何開始H。

另外我還有一個想法,即每個塊都以一個字符開頭,然後是一些以空格開頭,然後是結尾的行,但問題是如何啓動該模式。

+0

不會'diff'完全符合你的要求嗎? – Jan

+0

塊應該在兩個文件中的順序相同嗎? –

+0

哪個'diff'? @Jan –

回答

0

你可以使用下面的正則表達式匹配塊:

/.*?\R!\R*/s 

\R比賽換行,並s修改可以確保.也將匹配換行符。

然後,您可以使用preg_match_all得到從文本的所有塊,並用array_diff進行比較,並提取不同的塊:

$text1 = file_get_contents("first.txt"); 
$text2 = file_get_contents("second.txt"); 

preg_match_all('/.*?\R!\R*/s', $text1, $blocks1); 
preg_match_all('/.*?\R!\R*/s', $text2, $blocks2); 

$result = array_diff($blocks1[0], $blocks2[0]); 

print_r($result); 

看到它在eval.in運行;

0

這是查找以'!'分隔的兩個文件的常見部分和唯一部分的一種方法。

<?php 

$first_txt = "interface Vlan11 
description xxx 
ip address 10.10.10.10 255.255.255.255 
shutdown 
! 
vlan 34 
! 
vlan 17 
name sth 
! 
route-map sth 
match ip address exm 
set ip next-hop 1.2.3.4 
! 
"; 


$second_txt = "interface Vlan11 
description xxx 
ip address 20.20.20.20 255.255.255.255 
shutdown 
! 
vlan 34 
! 
route-map sth 
match ip address exm 
set ip next-hop 1.2.3.4 
! 
"; 

$first_parts=explode('!',$first_txt); 
$second_parts=explode('!',$second_txt); 

print_r($first_parts); 
print_r($second_parts); 

foreach ($first_parts as $part) 
{ 
    if (in_array($part, $second_parts)) 
    { 
     echo "found in second_parts $part"; 
     echo ""; 
    } 
    else 
    { 
     echo "not found in second_parts $part"; 
     echo ""; 
    } 
} 
foreach ($second_parts as $part) 
{ 
    if (in_array($part, $first_parts)) 
    { 
     echo "found in first_parts $part"; 
     echo ""; 
    } 
    else 
    { 
     echo "not found in first_parts $part"; 
     echo ""; 
    } 
}