2013-09-06 9 views
3

J'ai cette chaîne misquelle est la meilleure façon de diviser la chaîne

Host: example.com, IP address: 37.0.122.151, SBL: SBL196170, status: unknown, level: 4, Malware: Citadel, AS: 198310, country: RU 

je voudrais avoir chaque donnée dans ce format.

$host = "example.com"; 
$ip = "37.0.122.151"; 
$SBL = "SBL196170"; 
$status = unknown; 
$level = "4"; 
$malware = "Citadel"; 
$as = "1098310"; 
$country = "RU"; 

Quelle est la meilleure façon d'obtenir cette chaîne? Dois-je diviser par "," d'abord et ":" plus tard ou il y a une solution avec une division?

Merci d'avance.

+1

Peut-être un bon cas d'utilisation pour les expressions régulières? –

Répondre

4

Comme si:

$input = "Host: example.com, IP address: 37.0.122.151, SBL: SBL196170, status: unknown, level: 4, Malware: Citadel, AS: 198310, country: RU"; 
preg_match_all('/(\w+): ([\w.]+)/', $input, $matches); 
print_r($matches); 

Sortie:

Array 
(
    [0] => Array 
     (
      [0] => Host: example.com 
      [1] => address: 37.0.122.151 
      [2] => SBL: SBL196170 
      [3] => status: unknown 
      [4] => level: 4 
      [5] => Malware: Citadel 
      [6] => AS: 198310 
      [7] => country: RU 
     ) 

    [1] => Array 
     (
      [0] => Host 
      [1] => address 
      [2] => SBL 
      [3] => status 
      [4] => level 
      [5] => Malware 
      [6] => AS 
      [7] => country 
     ) 

    [2] => Array 
     (
      [0] => example.com 
      [1] => 37.0.122.151 
      [2] => SBL196170 
      [3] => unknown 
      [4] => 4 
      [5] => Citadel 
      [6] => 198310 
      [7] => RU 
     ) 

) 

Puis:

$mydata = array_combine($matches[1], $matches[2]); 
print_r($mydata); 

donne:

Array 
(
    [Host] => example.com 
    [address] => 37.0.122.151 
    [SBL] => SBL196170 
    [status] => unknown 
    [level] => 4 
    [Malware] => Citadel 
    [AS] => 198310 
    [country] => RU 
) 
+1

Je pense beaucoup à l'expression régulière pour cette simple analyse, et dans ce cas vous utilisez 4 tableaux. Le "problème" pourrait être si une clé ou une valeur peut avoir un ',' ou ':' dans une séquence espace comme 'key:" v, alue "' –

+0

@DiegoCNascimento il n'y a pas de chaînes entre guillemets indiquées dans le format d'entrée, et si nous devons nous inquiéter de "ce qui se passe si quelqu'un alimente mal mon programme", alors personne ne pourra jamais faire quelque chose.Garbage In, Garbage Out. – Sammitch

+0

Je suis d'accord avec vous dans le premier paragraphe. Mais à propos de l'autre, en aucun cas, vous devriez toujours vérifier les entrées valides ou vous allez donner des exploits aux utilisateurs mal intentionnés. –

1

J'utiliser un simple exploser sur la chaîne, puis pour chaque élément remplir un tableau avec les informations clés/valeur:

$string = 'Host: ...'; 
$raw_array = explode(',', $string); 
$final_array = array(); 
foreach($raw_array as $item) { 
    $item_array = explode(':', trim($item)); 
    $key = trim($item_array[0]); 
    $value = trim($item_array[1]); 
    $final_array[$key] = $value; 
} 
var_dump($final_array); 

Notez que ce n'utilise pas variable individuelle comme demandé dans votre question, mais remplissant plutôt un seul tableau avec une valeur de clé basée sur les clés de la chaîne. C'est une approche plus flexible.

0

Thr en raison d'un peu de programmation fonctionnelle dans le mélange, vous obtenez:

$string = 'Host: xxx.com, IP address: 37.0.122.151, SBL: SBL196170, status: unknown, level: 4, Malware: Citadel, AS: 198310, country: RU'; 
$result = array_reduce(explode(',', $string), function($result, $item) { 
    $pair = explode(':', $item); 
    $result[trim($pair[0])] = trim($pair[1]); 
    return $result; 
}, array()); 
1

Vous pouvez utiliser un remplacement regex pour la transformer en une chaîne chaîne-Esq requête, puis utilisez parse_str pour la transformer en un tableau associatif. Pas de boucles, deux lignes!

$string = preg_replace(array('/:/', '/, /'), array('=','&'), $string); 
parse_str($string, $output); 

var_dump($output); 
/* 
array(8) { ["Host"]=> string(8) " xxx.com" ["IP_address"]=> string(13) " 37.0.122.151" ["SBL"]=> string(10) " SBL196170" ["status"]=> string(8) " unknown" ["level"]=> string(2) " 4" ["Malware"]=> string(8) " Citadel" ["AS"]=> string(7) " 198310" ["country"]=> string(3) " RU" } 
*/ 

Essayez ici: http://codepad.viper-7.com/5gwWyC

Documentation

0

Voici une fonction très simple et pratique que j'utilise tout le temps pour des choses comme ça.

<?php 

function get_string_between($string, $start, $end){ 
    $string = " ".$string; 
    $ini = strpos($string,$start); 
    if ($ini == 0) return ""; 
    $ini += strlen($start); 
    $len = strpos($string,$end,$ini) - $ini; 
    return substr($string,$ini,$len); 
} 

$src = "Host: xxx.com, IP address: 37.0.122.151, SBL: SBL196170, status: unknown, level: 4, Malware: Citadel, AS: 198310, country: RU"; 

//add a character to src to help identify the last field 
$src = $src.","; 

$host = get_string_between($src, "Host: ", ","); //this is grabbing any text between "Host: " and "," 
$ip = get_string_between($src, "IP address: ", ","); 
$SBL = get_string_between($src, "SBL: ", ","); 
$status = get_string_between($src, "status: ", ","); 
$level = get_string_between($src, "level: ", ","); 
$malware = get_string_between($src, "Malware: ", ","); 
$as = get_string_between($src, "AS: ", ","); 
$country = get_string_between($src, "country: ", ","); 

?> 

Bonne programmation!

Questions connexes