2016-07-04 16 views
0

Mit PHP Ich möchte zwei Textdateien vergleichen, die erste Datei ist die wichtigste Datei, die der andere mit ihm vergleichen sollte. Wenn eine Zeile von first.txt nicht in second.txt existiert oder unterscheidet sich von ihm, das Skript sollte den ganzen Block dieser Zeile zurückkehren, zum Beispiel:Extrahieren Sie Textblock mit Regex

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 
! 

Sekunde. 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 
! 

Für den Vergleich extrahiert ich die first.txt Linien mit file() und sie in der second.txt, nun die IP-Adresse suchen unterscheidet sich in der dritten Reihe von second.txt, dann sollten wir den Block dieser Linie (von interface zum Knall (!)) zurück:

interface Vlan11 
description xxx 
ip address 20.20.20.20 255.255.255.255 
shutdown 
! 

oder in der second.txt einem der vlan Blöcke existiert nicht, so sollte es zurückkehrt:

vlan 17 
name sth 
! 

es ist einfach, einen regulären Ausdruck zu schreiben, die den Block zwischen den beiden Pony extrahiert, sondern weil ich sollte ich an den Anfang des Blocks don‘zurück Ich weiß, wie das Muster beginnen sollte h.

Auch ich habe eine andere Idee, dass jeder Block mit einem Zeichen beginnt, dann einige Zeilen, die mit einem Leerzeichen und dann einen Knall am Ende beginnen, aber das Problem besteht darin, wie das Muster zu starten.

+0

Würde 'diff' nicht genau das tun, was Sie wollen? – Jan

+0

Sollen die Blöcke in den zwei Dateien in der gleichen Reihenfolge sein? –

+0

was 'diff'? @ Jan –

Antwort

0

Sie könnten die folgenden regulären Ausdruck verwenden Blöcke entsprechen:

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

Die \R Matches Zeilenumbrüche und der s Modifikator sorgt dafür, dass . auch neue Zeilen entsprechen.

Sie könnten dann preg_match_all verwenden, um alle Blöcke aus einem Text zu bekommen, und verwenden array_diff für den Vergleich und die Blöcke zu extrahieren, die anders sind:

$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); 

Sehen Sie es auf eval.in laufen;

0

Dies ist eine Möglichkeit, die gemeinsamen und eindeutigen Teile der zwei Dateien zu finden, die durch '!' Getrennt sind.

<?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 ""; 
    } 
} 
Verwandte Themen