正则表达式匹配价格字符串

时间:2012-10-19 13:23:27

标签: php regex string

我是PHP新手。我试图检查其中一个表单输入(包含在此示例的$price中)是否为小数,如下所示:

if(!preg_match("\\d+(.\\d{1,2})?", $price))
    //do something

在Java中,它本来是

price.matches("\\d+(.\\d{1,2})?")

但同样的正则表达式在PHP中不起作用。 preg_match也匹配子字符串吗?

我希望以下输入为真:

300
300.5
300.56

所有其他格式都应该是假的。我无法弄清楚如何在PHP中这样做。

4 个答案:

答案 0 :(得分:5)

我不明白这可能如何在Java中发挥作用。第一个数字只匹配一个数字。您的示例匹配几位数。

请尝试使用此正则表达式:

/\d+(?:\.\d{1,2})?/

请注意我是如何将正则表达式放在"包装器中的?#34; (/)并注意我在数字匹配前删除了\的转义。此外,我使用非捕获组替换了小数点周围的捕获组,因为在您的上下文中它看起来不像您需要它。

PHP代码:

if (!preg_match("/\d+(?:\.\d{1,2})?/",$price)) {
    // do something
}

答案 1 :(得分:2)

我会说

\d(\.\d{1,2})?

据我记得,一个点也需要转义

答案 2 :(得分:1)

(!preg_match("/\d(\.\d{1,2})?/",$price))

记住开始和结束/'s

答案 3 :(得分:1)

我们这样做

is_string($price) and trim($price); // Might be worth doing first
if(preg_match('~^\\d+(?:\\.\\d{1,2})?$~', $price)) {
   $price = floatval($price); // Kewl, keep going
}else{
   // Unkewl, fail
}
  1. 在〜字符中包装RegExp 。任何非保留字符都可以作为包装器使用,并且在处理URL或HTML时非常糟糕,因为您也需要将其转义。这是一场噩梦。
  2. 强制字符串完全匹配封装在^和$ 中,而不是包含匹配,就像这里所有这些变体一样。
  3. 如果您没有需要在其中展开的 PHP“{$ variables}”,请用单引号换行字符串。
  4. 即使在单引号字符串中也可以转义,例如\ d或\。!
  5. 不要捕获块,无论如何都无关紧要,但这是表现的事。
  6. :)完成了Rant!