【问题标题】:Regular Expression - PHP正则表达式 - PHP
【发布时间】:2013-05-30 09:58:27
【问题描述】:

我正在使用以下 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  
   --------------------------------------------------------------------------------

我想要做的是从下表中读取 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
   ----------------------------------------------------------------------

【问题讨论】:

  • 如果你能想出第一个表达式,那么第二个应该不会有任何问题。
  • 表格数据是纯文本还是HTML?这将对构造正则表达式产生影响。

标签: php regex preg-match preg-match-all


【解决方案1】:

你也可以使用T-Regx library

<?php
pattern('Gold\s+([0-9.]+)\s+([0-9.]+)', 'i')->match($data)->forEach(function ($m) {
    print 'bid: ' . $m->group(1);
    print 'ask: ' . $m->group(2);
});

【讨论】:

    【解决方案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];
    

    【讨论】:

    • 我试图更改代码但它没有显示任何记录它的空白?请查看dev1.edisbest.com/test.php
    • OP 可能使用他们原来的 $variable 名称而不是 $string。我在我的服务器上测试过,这个方法也有效。
    • OP:您是要读取 HTML 格式的数据还是纯文本格式的数据?
    【解决方案3】:

    这里我只匹配数字和句点字符。此代码应返回您要查找的数字。它使用您示例中的数据字符串。

    <?
    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
    

    【讨论】:

      猜你喜欢
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多