IP-Doubletten in einem Text finden

Eiszwerg

Erfahrenes Mitglied
Moin liebe Community,

ich möchte ein kleines Tool schreiben, welches folgenden Text nach IP-Doubletten durchsucht und am Besten auch gleich zeigt welche:
Code:
Clients on server:
 #  nick                       authid               userid   adm  res  rate     upd   ip
 1  Hugo                       STEAM_0:0:7179871    192      no   no   25000    101   84.143.77.170:2
 2  cuddy                      STEAM_0:1:46665      215      no   no   25000    101   80.136.73.17:27
 3  Hanszr                     STEAM_0:0:1288563    226      no   no   25000    101   85.228.117.58:1
 5  D4RK                       STEAM_0:0:9969296    167      no   no   30000    101   84.182.125.22:2
 6  juve9le                    STEAM_0:0:14212215   212      no   no   25000    101   84.180.216.20:2
 7  bobmbspotjogger            STEAM_0:1:28101      220      no   no   20000    101   87.234.135.228:
 8  <3 luna                    STEAM_0:1:3575092    221      no   no   20000    100   91.96.111.106:6
10  sTunKer.                   STEAM_0:1:15322568   227      no   no   25000    101   213.138.251.254
11  crashburn                  STEAM_0:0:55948      213      no   no   30000    20    90.20.150.193:6
12  dr. mombo                  STEAM_0:1:522504     222      no   no   20000    50    89.59.181.164:6
14  Cuddys bruder STealth <3   STEAM_0:0:1307605    217      no   no   25000    100   89.56.22.127:27
Leider habe ich nicht die geringste Ahnung, wie ich das anzugehen hab.
Von der Anwendung her soll es so sein, dass ich den Text in eine Textarea kopiere, mein Knöpfchen drücke und das Ergebnis bekomme.
Nur wie finde ich die Doubletten und ordne dann den Spielernamen zu?

Freu mich über Ideen und Anregungen!
 
Ich würde den eingegebenen Text per preg_match_all zerlegen. Und die IP Adressen in einem Array Speichern. Anschließend kannst du es Sortieren Stepp für Stepp durchgehen und überprüfen ob das aktuelle Element gleich dem vorherigen ist.

Ich denke so würde ich es machen auf die Schnelle.
 
Ich würde den eingegebenen Text per preg_match_all zerlegen. Und die IP Adressen in einem Array Speichern. Anschließend kannst du es Sortieren Stepp für Stepp durchgehen und überprüfen ob das aktuelle Element gleich dem vorherigen ist.
Problem: wenn die 1. und 4. IP gleich sind, findet er sie nicht...
 
Regex ist wahrscheinlich ein wenig falsch, aber an sich sollte es so funktionieren:

PHP:
<?php
<?php
// Zeilen in Array splitten
$lines = explode("\n", $_POST['input']);
$found = $double = array();

// durchlaufen
foreach ($lines as $no => &$line) {
    if (preg_match('=^[\s]*[\d]+[\s]+([\S]+)[\s]+[\d]+[\s]+[\w]+[\s]+[\d]+[\s]+[\S]+[\s]+([\d]{1,3}.[\d]{1,3}.[\d]{1,3})$=Uis', $line, $hits)) {
        $found[$hits[1]] = $hits[2];
        if ($index = array_search($hits[2], $found) !== false) {
            $double[$hits[2]][] = $index;
        }
    }
}

// ...
// Problem: Erstes Vorkommen einer Duplette wird nicht gelistet, könnte aber durch ein paar extra Zeilen leicht hinzugefügt werden

Alternativ würde ich nen Array in der Form ip => array of names anlegen, und dann schauen, ob in einem "ip-Array" mehrere Einträge vorhanden sind (count($current_ip) > 1) ;)
 
PHP:
<?php
$str='
Clients on server:
 #  nick                       authid               userid   adm  res  rate     upd   ip
 1  Hugo                       STEAM_0:0:7179871    192      no   no   25000    101   84.143.77.170:2
 2  cuddy                      STEAM_0:1:46665      215      no   no   25000    101   80.136.73.17:27
 3  Hanszr                     STEAM_0:0:1288563    226      no   no   25000    101   85.228.117.58:1
 5  D4RK                       STEAM_0:0:9969296    167      no   no   30000    101   84.182.125.22:2
 6  juve9le                    STEAM_0:0:14212215   212      no   no   25000    101   84.180.216.20:2
 7  bobmbspotjogger            STEAM_0:1:28101      220      no   no   20000    101   87.234.135.228:
 8  <3 luna                    STEAM_0:1:3575092    221      no   no   20000    100   91.96.111.106:6
 9  Uschi                      STEAM_0:1:3575092    221      no   no   20000    100   91.96.111.106:7
10  sTunKer.                   STEAM_0:1:15322568   227      no   no   25000    101   213.138.251.254
11  crashburn                  STEAM_0:0:55948      213      no   no   30000    20    90.20.150.193:6
12  dr. mombo                  STEAM_0:1:522504     222      no   no   20000    50    89.59.181.164:6
13  dr. molle                  STEAM_0:1:522504     222      no   no   20000    50    89.59.181.164:6
14  Cuddys bruder STealth <3   STEAM_0:0:1307605    217      no   no   25000    100   89.56.22.127:27';

preg_match_all('@^\s*\d+\s+((.+)(?=STEAM_)).*\s+([\d\.]+)(|:\d*)\s*$@m',$str,$out);

$double=array_unique(  array_diff_assoc(   $out[3],array_unique($out[3])    ));
foreach($out[3] as $k => $v)
  {
    if(in_array($v,$double))echo '<br>'.$v.' : '.$out[1][$k];
  }
?>
 
Sven: absolut genial :)

Aaaaber: magst Du mir kurz den regulären Audruck en detail erklären? Ich steige da überhaupt nicht durch den Zeichenwirrwarr durch :(

Danke Dir :)
 
Da mir grad langweilig war, hier noch eine andere Lösung...

PHP:
<?
$data = "Clients on server:
 #  nick                       authid               userid   adm  res  rate     upd   ip
 1  Hugo                       STEAM_0:0:7179871    192      no   no   25000    101   84.143.77.170:2
 2  cuddy                      STEAM_0:1:46665      215      no   no   25000    101   80.136.73.17:27
 3  Hanszr                     STEAM_0:0:1288563    226      no   no   25000    101   85.228.117.58:1
 5  D4RK                       STEAM_0:0:9969296    167      no   no   30000    101   84.182.125.22:2
 6  juve9le                    STEAM_0:0:14212215   212      no   no   25000    101   84.180.216.20:2
 7  bobmbspotjogger            STEAM_0:1:28101      220      no   no   20000    101   87.234.135.228:
 8  <3 luna                    STEAM_0:1:3575092    221      no   no   20000    100   91.96.111.106:6
10  sTunKer.                   STEAM_0:1:15322568   227      no   no   25000    101   213.138.251.254
11  crashburn                  STEAM_0:0:55948      213      no   no   30000    20    90.20.150.193:6
12  dr. mombo                  STEAM_0:1:522504     222      no   no   20000    50    89.59.181.164:6
14  Cuddys bruder STealth <3   STEAM_0:0:1307605    217      no   no   25000    100   89.56.22.127:27";


preg_match_all("%  (.*)  STEAM.*([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})%iU", $data, $sub);

for ($i=0;$i<count($sub[0]);$i++){
    $users[$sub[2][$i]] .= trim($sub[1][$i]).', ';
    $ips[$sub[2][$i]]++;
}
// Zu welcher IP Gehört welche User`s
print_r($users);

// Nochmal die reine Aufaddierung
print_r($ips);
?>
 
Sven: absolut genial :)

magst Du mir kurz den regulären Audruck en detail erklären? Ich steige da überhaupt nicht durch den Zeichenwirrwarr durch :(

Jo, Klar:
  • ^
    Zeilenbeginn
  • \s*
    beliebig viele Leerzeichen
  • \d+
    eine oder mehr Ziffern
  • \s+
    ein oder mehr Leerzeichen
  • ((.+)(?=STEAM_))
    mehrere Zeichen, welche von "STEAM_" gefolgt werden. Das ganze wird geklammert, weil diese Zeichen benötigt werden(sie sind der Benutzername)
  • .*
    beliebige Zeichen
  • \s+
    beliebig viele Leerzeichen
  • ([\d\.]+)
    ein oder mehr Ziffern oder Punkte, wiederum geklammert, das ist die IP
  • (|:\d*)
    nix oder Doppelpunkt gefolgt von beliebig vielen Ziffern(der Port)
  • \s*
    beliebig viele Leerzeichen
  • $
    Zeilenende
  • m
    Flag "multiline"...der String wird dadurch Zeilenweise untersucht und nicht im Ganzen
 
Zurück