【问题标题】:preg_match decimals not workingpreg_match 小数不起作用
【发布时间】:2012-04-29 10:39:00
【问题描述】:

我似乎遇到了 preg_match 代码的问题,我试图从应该类似于“3.25”的字符串中获取十进制数,但我得到的是“1”

preg_match('/[0-9]+(?:\.[0-9]*)?/', '£3.25', $matches);
echo 'match: '.$matches[0];

打印“1”

【问题讨论】:

  • print_r($matches); 输出什么?
  • @mk_89,这很奇怪。我得到3.25。确定没有其他因素影响?
  • 你运行的是什么版本的php?您的文件(以及您匹配的主题)是什么字符集?
  • 那么很可能是其他因素在影响它,这实际上是一个来自爬虫的字符串,我会尝试解决这个问题。谢谢你们的帮助。

标签: php regex preg-match


【解决方案1】:
preg_match('#\d+(?:\.\d{1,2})?#', '£2.35', $match);
var_dump($match);

给了

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

即使在 PHP 5.2 上:http://codepad.viper-7.com/9nFhET

【讨论】:

    【解决方案2】:

    首先,您会在数组的索引 1 处找到值 ($matches[1])

    尝试类似的方法:

    <?php
    preg_match('/[0-9]+\.([0-9]+)/', '£3.25', $matches);
    print_r($matches);
    ?>
    

    这给了:

    Array
    (
        [0] => £3.25
        [1] => 25
    )
    

    【讨论】:

    • 为什么你会期望在索引 1 处匹配?不是完全匹配存储在第一个数组中,所以如果你有 2 个匹配项,那么第一个匹配项将位于索引 0 处,而最后一个匹配项位于该数组中的索引 1 处? mk_89 在示例中使用了非捕获组
    【解决方案3】:

    我可以在这个测试网站上重现小数问题:
    http://www.pagecolumn.com/tool/pregtest.htm

    如果您将转义的点替换为包含点的字符类,它会起作用:

    [0-9]+(?:[.][0-9]*)?
    

    顺便说一句:你有没有可能得到点但后面没有数字?
    如果不是,我会将[0-9]* 替换为[0-9]+ 或预期的特定位数[0-9]{2}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多