2011-05-07 3 views
1

j'ai sortie du serveur qui ressemble à ceci
PLAYER_ENTERED name ipaddress username
PHP: découpant une chaîne et l'impression

Si la chaîne contient PLAYER_ENTERED il y aura toujours 3 espaces dans la chaîne séparant (comment cela peut-être modifiée de façon à est-ce aussi?). Je voudrais imprimer seulement l'adresse ip et le nom d'utilisateur (2 dernières sections). Comment cela peut-il être fait?


C'est un code qui imprime la chose:

$q = $_REQUEST["ipladder"]; 
$f = fopen("ladderlog.txt", "r"); 
while (($line = fgets($f)) !== FALSE) 
{ 
    if (strstr($line, $q)) 
    { 
     print "<li>$line"; 
    } 

J'imagine cela en utilisant explode() mais j'ai renoncé car je sais hardily comment le code php.

sortie désiré
nom d'utilisateur ipaddress

+1

S'il vous plaît donner un exemple de ce qu'il devrait ressembler, à la fois normal et abrégé. – wallyk

+0

ok je l'ai fait – dukevin

Répondre

3
$q = $_REQUEST["ipladder"]; 
$f = fopen("ladderlog.txt", "r"); 
while (($line = fgets($f)) !== FALSE) 
{ 
    if (strstr($line, $q)) 
    { 
     $data = explode(" ", $line); // split using the space into an array 
            // array index 0 = PLAYER_ENTERED 
     print "IP:" . $data[1];  // array index 1 = IP 
     print "Name: " . $data[2]; // array index 2 = name 
    } 
} 
+0

Merci, cela fonctionne très bien! Question de suivi si cela ne vous dérange pas, mais comment puis-je vérifier les doublons, comme ont 2 instances du même nom et IP – dukevin

+1

Plusieurs façons différentes à faire à ce sujet. C'est une autre toute nouvelle question, mais voici un endroit pour commencer.http: //www.php.net/manual/en/function.file.php, http://php.net/manual/fr/function.array- diff.php – robx

1

essayer cette ...

<? 
    $str = "PLAYER_ENTERED name 108.21.131.56 username"; 
    if (preg_match("~^(.+)\s+(.+)\s+([\d\.]+)\s+(.+)$~msi", $str, $vv)) 
     echo $vv[3] . " and " .$vv[4] ; 
    else "N/A"; 
?> 

à mon humble avis Perl regexp - est la bonne façon d'analyser des chaînes ...

+0

"nom" et "nom d'utilisateur" ne sont pas statiques, ils sont lus dans – dukevin

+0

Kevin, c'est un exemple ... il n'est pas lié sur _any_ nom ou ip :) Changer de chaîne ... pour voir différence, également pas liée au nombre d'espaces. "~^(. +) \ S + (. +) \ S + ([\ d \.] +) \ S + (. +) $ ~ Msi" –

1

Vous pouvez utiliser substr() pour vérifier si les 14 premiers caractères de $line est égal à PLAYER_ENTERED, puis vous utilisez list() et explode() pour extraire les données de la ligne.

$q = $_REQUEST["ipladder"]; 
$f = fopen("ladderlog.txt", "r"); 
while(($line = fgets($f)) !== FALSE) 
{ 
    if(substr($line, 0, 14) == 'PLAYER_ENTERED'){ 
     list($event, $name, $ip, $username) = explode($string); // here they come! 

     echo 'Name: ' . $name . ', ip: ' . $ip . ', username: ' . $username; 
    } 
} 
+0

rien ne s'imprime :( – dukevin

+0

Mon erreur, veuillez réessayer:) –

0

Une façon serait:

$tokens = explode(' ', $line); 
if (count($tokens) == 4 && $tokens[2] == $q) { 
    printf('IP: %s Username: %s', $tokens[2], $tokens[3]); 
} 
0
<?php 
$str = 'PLAYER_ENTERED name 108.21.131.56 username'; 

$data = explode(" ", $str) 

print_r($data) 

?> 
Questions connexes