Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Разбивка строки


Автор: kr3v3tkus 28.10.2008, 17:58
Строка $content содержит курсы валют, каждый элемент разделён табуляцией, как оттуда вытащить элементы при каждой 3ей табуляции? Чтобы был вывод например так
USD 2008-12-12 25.24
чтобы потом вгрузить в $ticker $date $price
или подскажите как это легче сделать? мб функция есть замены какаято?

Код

<?php

function get_content($url)
{
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_HEADER, 0);
    ob_start();
    curl_exec ($ch);
    curl_close ($ch);
    $string = ob_get_contents();
    ob_end_clean();
    return $string;
}

$ticker = array();
$date = array();
$price = array();
$n = 0;

$content = get_content (
    'http://export.rbc.ru/free/cb.0/free.fcgi?period=DAILY&tickers=NULL&'.
    'd1='.date('d',time()).'&m1='.date('m',time()).'&y1='.date('Y',time()).
    '&d2='.date('d',time()).'&m2='.date('m',time()).'&y2='.date('Y',time()).
    '&lastdays=0&separator=TAB&data_format=BROWSER', "r"
    );

  for ($i=0; $i<5; $i++) {
   $buffer = explode("    ", $content[i], 4096);
   $ticker[$n] = $buffer[0];
   $date[$n] = $buffer[1];
   $price[$n] = $buffer[5];
   $n++;
}

Автор: HackMan 28.10.2008, 18:06
может http://ua2.php.net/explode?

Автор: kr3v3tkus 28.10.2008, 18:16
Цитата

 $buffer = explode("    ", $content[i], 4096);

дык эксплод кушает всю строку, а как в этой строке именно по третьему табу разбить?
т.е. при выводе у меня получается
AUD    2008-10-28    16.6183
AUD    2008-10-28    16.6183
AUD    2008-10-28    16.6183
AUD    2008-10-28    16.6183
тк он только первые 3 параметра от строки берёт

Автор: bars80080 28.10.2008, 18:22
попробуй так

Код

$buffer = explode("\t", $content[i]);

var_dump($buffer[3]);

Автор: kr3v3tkus 28.10.2008, 18:34
bars80080, 
а это один раз перед циклом сделать? Я уж куда ни пихаю - никак неполучается(

мб меня не понял никто - я оч плохо обясняю smile а то просто не пойму зачем content[i] - строка то одна, а ниже где explode - это я ошибся там нечайно [i] поставил... ща ... вот есть строка
Цитата

AUD 2008-10-28 16.6183 BYR 2008-10-28 12.941 CAD 2008-10-28 21.2499 CHF 2008-10-28 23.3987 CNY 2008-10-28 39.9228 DKK 2008-10-28 45.5443 EUR 2008-10-28 34.0844 GBP 2008-10-28 42.1775 ISK 2008-10-28 22.5248 JPY 2008-10-28 29.5029 KZT 2008-10-28 22.8094 NOK 2008-10-28 38.6151 SEK 2008-10-28 33.8273 SGD 2008-10-28 18.0795 TRY 2008-10-28 15.9656 UAH 2008-10-28 45.9676 USD 2008-10-28 27.3507 XDR 2008-10-28 40.697

и из неё сделать 
Цитата

AUD 2008-10-28 16.6183
BYR 2008-10-28 12.941
CAD 2008-10-28 21.2499
CHF 2008-10-28 23.3987
CNY 2008-10-28 39.9228
...
XDR 2008-10-28 40.697

Автор: bars80080 28.10.2008, 18:39
нет, заместо твоей строки $buffer = explode("    ", $content[i], 4096);
тыж драконишь строчку массива

после неё поставь скажем var_dump($buffer); посмотри что получится, ну и сюда скинь, если что не так

Автор: HackMan 28.10.2008, 18:50
попробуй регулярные выражения, с паттерном вроде этого: ([^\s]+[\s]){3}

Автор: smartov 28.10.2008, 19:15
kr3v3tkus, 
Код

$string = ' ... тут твоя строка разделённая табуляторами ... ';

preg_match_all('/([^\t]+\t[^\t]+\t[^\t]+)\t?/', $string, $matches);
print_r($matches[0]);

Автор: kr3v3tkus 28.10.2008, 19:15
bars80080, 
Цитата

array(1) { [0]=> string(1) "A" } array(1) { [0]=> string(1) "A" } array(1) { [0]=> string(1) "A" } array(1) { [0]=> string(1) "A" } array(1) { [0]=> string(1) "A" }

только первую букву глотает :(


HackMan, 
для меня сложно :( я так и не выучил все эти флаги в выражениях :(

Автор: kr3v3tkus 28.10.2008, 19:19
smartov, 
вот опять же - я немогу даже с этим разобраца :( подставил - вывело
Цитата

Array ( ) 

и усё :( 

Автор: smartov 28.10.2008, 19:21
kr3v3tkus, значит строка была разбита не табуляторами

Добавлено через 3 минуты и 33 секунды
Давайте так. Вот вам наверняка рабочий пример. Строка разбита пробелами. Думаю дальше сами сможете.

Код

<?php

$string = '1 2 3 4 5 6 7 8 9';

preg_match_all('/([^\s]+\s{1}[^\s]+\s{1}[^\s]+)\s{0,1}/', $string, $matches);
print_r($matches[0]);

?>


У вас, я думаю, строка разбита четярьмя пробелами а не табулятором. Если это так, то заменить в регулярке единички на 4 особого туда не составит smile

Автор: kr3v3tkus 28.10.2008, 19:25
ну вот не знаю как они так разбили... я просто отступ ихний копировал и у меня шло :(
http://export.rbc.ru/free/cb.0/free.fcgi?period=DAILY&tickers=NULL&d1=28&m1=10&y1=2008&d2=28&m2=10&y2=2008&lastdays=0&separator=TAB&data_format=BROWSER

Автор: smartov 28.10.2008, 19:38
kr3v3tkus, 
тогда должно работать вот это

Код

$string = ' ... тут эта самая строка ... ';

preg_match_all('/([^\s]+\s+[^\s]+\s+[^\s]+)\s*/', $string, $matches);
print_r($matches[0]);


Добавлено через 2 минуты и 23 секунды
Хотя лично я и предпочситаю писать регулярки чётко под ожидаемую строку. Но зато эта должна работать почти на любых разделителях.

Добавлено через 2 минуты и 38 секунд
Имеется в виду на любых пробелах или табуляторах или и том и том

Автор: kr3v3tkus 28.10.2008, 19:57
smartov, крута smile ток можна последний вапрос, а то ваще никак с регулярками не пойму( как написать наподобие этого
Код

  for ($i=0; $i<18; $i++) {
   $buffer = explode("\s", preg_match_all('/([^\s]+\s+[^\s]+\s+[^\s]+)\s*/', $content, $matches));
   $ticker[$n] = $buffer[0];
   $date[$n] = $buffer[1];
   $price[$n] = $buffer[2];
   $n++;
   }

чтобы все эти три разных элемента строки в 3 разных массива поместить? Как можно с помощью explode выдрать из этого preg_match_all?

Автор: smartov 28.10.2008, 20:12
Не. Дальше я пас это сильно просто. С такими вопросами в Центр помощи, а лучше на читать доку на php.net

Автор: kr3v3tkus 28.10.2008, 20:14
smartov, ок сенк большое smile
всем пасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)