разделение сложной строки

#php

#php

Вопрос:

У меня есть строковая переменная, подобная приведенной ниже. Я пытаюсь разделить ее на массив или даже на отдельные переменные для каждого элемента (изменение, максимум дня и т.д.).

 $a='last: 901.5001 @ 11:35am EST 11/10/2011 <br>change: -5.9999 <br>day high: 
921.50 <br>day low: 882.00 <br>open: 917.50 <br>volume: 808998';
echo $a;
  

Есть идеи, как мне это сделать?

Ответ №1:

Это должно сделать

 $tmps = explode('<br>', $string);
$arr = array();
foreach($tmps as $tmp){
    list($key, $val) = explode(':', $tmp,2);
    $arr[trim($key)] = trim($val);
}
var_dump($arr)
  

вы можете изменить строку $arr[trim($key)] на $arr[] , если вас не волнует, что было перед :

Комментарии:

1. Вероятно, Дэвид намеревается снова разделить ее с помощью ‘:’, чтобы получить, т.е. $arr['day high'] = 921.50

Ответ №2:

Сначала вы могли бы разделить на <br> , а затем разделить на первое двоеточие:

 $temp = explode("<br>",$a);
$data = array();
foreach ($temp as $item) {
   list($name, $value) = explode(":", $item, 2);
   $data[$name] = $value;
}
  

должен выводить:

 Array
(
   [last] => 901.5001 @ 11:35am EST 11/10/2011
   [change] => -5.9999
   [day high] => 921.50
   [open] => 882.00
   ... etc ...
)
  

Комментарии:

1. о, ты опередил меня в этом. Однако мой работает на наносекунды быстрее. 😛

Ответ №3:

 $step_one = explode('<br>', $string);
foreach($step_one as $step_two)
{
    $step_three = explode(': ', $step_two);
    $final[$step_three[0]] = $step_three[1];
}
var_dump($final);
  

Или чтобы получить то, что в вашем комментарии:

 $step_one = explode('<br>', $string);
foreach($step_one as $step_two)
{
    $step_three = explode(': ', $step_two);
    $final[] = $step_three[1];
}
var_dump($final);
  

Ответ №4:

Использование сопоставления строк (особенно регулярных выражений) в HTML может быть опасным, поскольку любое небольшое изменение может все испортить. Но если известно, что ваш код хорош:

 preg_match_all('/([^:] ):(. )<br>/U', $a.'<br>', $m, PREG_SET_ORDER);
$a = array();
foreach ($m as $v) $a[$v[1]] = trim($v[2]);

var_dump($a);
  

Если вам не нужны ключи, тогда это просто становится:

 preg_match_all('/:(. )<br>/U', $a.'<br>', $m, PREG_SET_ORDER);
$a = array();
foreach ($m as $v) $a[] = trim($v[1]);
  

Или даже:

 preg_match_all('/:s(. )s<br>/U', $a.'<br>', $m);
$a = $m[1];