正则表达式始终在PHP中评估为true

Fat*_*onk -2 php regex preg-match

我试图在PHP中检查正或负浮点数或整数值,但我无法弄清楚为什么我的正则表达式总是评估为真.

这是代码:

if ( preg_match('/-?[\d]*\.?[\d]*/',   "1.57a") ) {
  echo "OK: matches";
} else {
  echo "Bad: doesn't match";
  exit();
}
Run Code Online (Sandbox Code Playgroud)

我已经在几个测试器中测试了regexp模式,并且根据需要匹配和不匹配,但上面的代码/ always /返回1.

我猜这是非常明显的,但我找不到它.

cHa*_*Hao 5

我们来看看你的正则表达式.

-?[\d]*\.?[\d]* 火柴

  • 一个可选的破折号,然后是
  • 零或更多(读取:可选)数字,然后
  • 一个可选的点,然后
  • 零个或多个(再次,可选)数字.

由于每个部分都是可选的,即使是空字符串也会匹配.由于你没有锚定模式,它将成功匹配字符串中任何位置的零字符.

如果你希望表达式除了数字之外的所有内容都失败,那么你需要做两件事:

  1. 锚定模式.分别使用^$在模式的开头和结尾.如果字符串在错误的位置有错误的字符,这将使字符串不匹配.

  2. 制作所需的零件之一. 您的模式的至少一部分需要匹配一次或多次; 否则,它甚至会匹配一个空字符串.

请注意,这些中的任何一个都不够.锚定模式不会排除空字符串,并且制作所需的部分不会使您的模式不匹配whatever0.5.您需要同时执行这两项操作,除非您尝试匹配字符串中任何具有数字外观的部分.(即便如此,你可能还想看看使用\b和/或前瞻/ 外观,以帮助确保你没有像在一个单词中间那样开始或结束古怪的地方.)