duangenshi9836 2012-10-19 13:23
浏览 25
已采纳

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

I am new in PHP. I was trying to check if one of the form inputs (contained in $price for this example) is a decimal as follows:

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

In Java, it would have been

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

But the same regex is not working in PHP. Does preg_match match substrings as well?

I expect the following inputs to be true:

300
300.5
300.56

All other formats should be false. I cannot figure out how to do that in PHP.

  • 写回答

4条回答 默认 最新

  • ds0409 2012-10-19 13:55
    关注

    Let's do this right:

    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. Wrap RegExp in ~ character. Any non-reserved character works as a wrapper and / is terrible when dealing with URLs or HTML as you need to escape it too. It's a nightmare.
    2. Force the string to exact match by enclosing in ^ and $ and not a contain match like all these variants here.
    3. Wrap string in single quotes if you don't have PHP "{$variables}" that need to be expanded in them.
    4. Escape \ even in single quoted string like this \d or \.!
    5. Don't capture the block, it does not matter anyway but is a performance thing.

    :) Rant done!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题