2013-06-04 2 views
3

Я использую следующий PHP кодRegular Expression - PHP

<? 
    $data = file_get_contents('http://www.kitco.com/texten/texten.html'); 
    preg_match_all('/([A-Z]{3,5}\s+[0-9]{1,2},[0-9]{4}\s+([0-9.NA]{2,10}\s+){1,7})/si',$data,$result); 

    $records = array(); 
    foreach($result[1] as $date) { 
     $temp = preg_split('/\s+/',$date); 
     $index = array_shift($temp); 
     $index.= array_shift($temp); 
     $records[$index] = implode(',',$temp); 
    } 
    print_R($records); 
?> 

прочитать следующие данные

-------------------------------------------------------------------------------- 
    London Fix   GOLD   SILVER  PLATINUM   PALLADIUM 
        AM  PM     AM  PM   AM  PM 
    -------------------------------------------------------------------------------- 
    Jun 03,2013 1396.75 1402.50 22.4300 1466.00 1487.00 749.00 755.00 
    May 31,2013 1410.25 1394.50 22.5700 1471.00 1459.00 755.00 744.00 
    -------------------------------------------------------------------------------- 

Что я хочу сделать, это Read GOLD (BID & ASK) цена снизу таблица, может ли кто-нибудь помочь в изменении регулярных выражений?

Нью-Йорк Пятно Цена РЫНОК ЗАКРЫТ Откроет в

---------------------------------------------------------------------- 
    Metals   Bid  Ask   Change  Low  High 
    ---------------------------------------------------------------------- 
    Gold   1411.20  1412.20 +22.90 +1.65% 1390.10 1418.00 
    Silver   22.74  22.84  +0.48 +2.13%  22.26 23.08 
    Platinum  1495.00  1501.00 +41.00 +2.82% 1470.00 1511.00 
    Palladium  756.00  761.00  +7.00 +0.93%  750.00 766.00 
    ---------------------------------------------------------------------- 
    Last Update on Jun 03, 2013 at 17:14.58 
    ---------------------------------------------------------------------- 
+0

Если бы вы могли придумать первое выражение, второй не должны создавать каких-либо проблем. –

+0

Являются ли данные таблицы обычным текстом или HTML? Это будет иметь значение при построении регулярного выражения. – itsmejodie

ответ

1

Здесь я использую только цифры и символ периода. Этот код должен вернуть номера, которые вы ищете. Он использует вашу строку данных из вашего примера.

<? 
preg_match_all('!Gold\s+([0-9.]+)\s+([0-9.]+)!i',$data,$matches); 

//New York 
$ny_bid = $matches[1][0]; 
$ny_ask = $matches[2][0]; 
print("NY\nbid: $ny_bid\n"); 
print("ask: $ny_ask\n\n"); 

//Asia 
$asia_bid = $matches[1][1]; 
$asia_ask = $matches[2][1]; 
print("Asia\nbid: $asia_bid\n"); 
print("ask: $asia_ask\n"); 
?> 

Выход

NY 
bid: 1411.20 
ask: 1412.20 

Asia 
bid: 1406.80 
ask: 1407.80 
+0

Отлично, что помогло :) – user580950

2

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

$string = "PLAIN TEXT TABLE DATA HERE"; 

preg_match('/Gold\s+(\d+\.\d{2})\s+(\d+\.\d{2})/',$string,$matches); 

$goldBid = $matches[1]; 
$goldAsk = $matches[2]; 
+0

Я попытался изменить код, но он не показывает какую-либо запись пустым? пожалуйста, проверьте его на http://dev1.edisbest.com/test.php – user580950

+0

OP, вероятно, использует свое исходное имя '$ variable' вместо' $ string'. Я тестировал на своем сервере, и этот метод также работает. –

+0

OP: вы пытаетесь прочитать данные в HTML или это простой текст? –