2013-09-06 10 views
3

У меня есть эта строка установить, что это лучший способ, чтобы разбить строку

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

Я хотел бы иметь каждый данные в этом формате.

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

Каков наилучший способ получить эту строку? Должен ли я разделить на "," первый и ":" позже или есть решение с одним сплитом?

Заранее спасибо.

+1

Может быть хорошим вариантом использования для регулярных выражений? –

ответ

4

Как так:

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

Выход:

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 
     ) 

) 

Тогда:

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

Дает:

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

Я думаю, что регулярное выражение так много для этого простого анализа, и в этом случае вы используете 4 массива. «Проблема» может заключаться в том, что ключ или значение могут иметь ',' или ':' внутри последовательности espace, например 'key: 'v, alue'' –

+0

@DiegoCNascimento в цитированных строках нет указателей, указанных во входном формате, и если нам нужно беспокоиться о том, «что произойдет, если кто-то подаст плохой ввод в мою программу», тогда никто никогда ничего не добьется.Мусор, Мусор. – Sammitch

+0

Я согласен с вами в первом абзаце. Но о другом, ни в коем случае, вы всегда должны проверять правильность ввода или вы собираетесь использовать эксплойты для нехороших намеренных пользователей. –

1

Я хотел бы использовать простой взрываются на строке, а затем для каждого элемента заполнения массива с информацией ключ/значение:

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

Обратите внимание, что это не с помощью индивидуальной переменной, как спросил в вашем вопросе, а заполнение одного массива с ключевым значением на основе ключей строки. Это более гибкий подход.

0

Thr благодаря немного функционального программирования в миксе, вы получите:

$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

Вы можете использовать замену регулярных выражений, чтобы превратить его в строку-ESQ строку запроса, а затем использовать parse_str, чтобы превратить его в ассоциативный массив. Нет петель, две линии!

$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" } 
*/ 

Попробуйте здесь: http://codepad.viper-7.com/5gwWyC

Документация

0

Вот очень простая и удобная функция, которую я все время использую для таких вещей.

<?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: ", ","); 

?> 

Счастливое кодирование!

Смежные вопросы