【问题标题】:Regular Expression Not Evaluating Properly In PHP正则表达式在 PHP 中没有正确计算
【发布时间】:2012-05-25 21:43:12
【问题描述】:

我遇到了 PHP 正则表达式匹配问题。

我要解决的问题是我需要从字符串中获取十进制值。表达式需要满足以下所有条件(所有美元符号可选):

($)1234.56
($)1,234.56
($)1.00
($)10
($).49
($)1,234,567.32
($)1,234,567

在网上找了一些精彩的例子后,我才能够把弗兰肯斯坦这个表达方式结合起来:

/(?:^|\s|\$)([1-9](?:\d*|(?:\d{0,2})(?:,\d{3})*)(?:\.\d*[0-9])?|0?\.\d*[0-9]|0)(?:\s|$)/

如果你使用这个 preg_match 测试器on solmetra,使用上面的模式和测试字符串'per unit price $19198.01 hey!'你会得到以下结果:

Array
(
    [0] => $19198.01 
    [1] => 19198.01
)

这太棒了——这正是我需要的!

但是,当我在 PHP 5.3.10 中运行以下代码时,我得到 null 作为使用此模式字符串匹配的输出:

代码:

  $pattern = '/(?:^|\s|\$)([1-9](?:\d*|(?:\d{0,2})(?:,\d{3})*)(?:\.\d*[0-9])?|0?\.\d*[0-9]|0)(?:\s|$)/';
  $subject = 'per unit price $19198.01 hey!';
  $matches = preg_match($pattern,$subject);                
  var_dump($matches[0]); //dumps "null"

我确定我做错了什么,但我就是看不到。

任何帮助将不胜感激。

环境:

PHP  5.3.10
Apache 2.2.21
Windows 2008 Server

【问题讨论】:

  • 不是十进制值而是格式化的货币字符串。

标签: php regex


【解决方案1】:

你的错误只是在函数用法上:

 $matches = preg_match($pattern,$subject);   

你实际上得到的是:

 $booleanresult = ...

但是您需要 preg_match 的第三个参数才能获得实际结果:

 $bool = preg_match($pattern, $subject, $matches);   

瞧,您的正则表达式确实有效。不过,我还推荐/x 标志以使其更具可读性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    相关资源
    最近更新 更多