2

我是 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

4 回答 4

5

我不明白这怎么可能在 Java 中起作用。第一个数字只匹配一个数字。您的示例匹配多个数字。

试试这个正则表达式:

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

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

PHP代码:

if (!preg_match("/\d+(?:\.\d{1,2})?/",$price)) {
    // do something
}
于 2012-10-19T13:26:05.897 回答
2

我会说

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

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

于 2012-10-19T13:30:43.450 回答
1
(!preg_match("/\d(\.\d{1,2})?/",$price))

记住开始和结束 / 的

于 2012-10-19T13:25:12.283 回答
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. 不要捕获块,无论如何都没关系,但它是一个性能问题。

:) 咆哮完成!

于 2012-10-19T13:55:36.253 回答