用正则表达式比较php中的两个价格字符串

时间:2019-06-21 09:33:11

标签: php regex string

假设我们有两个价格字符串,格式不同:

$s_price = '85.95' or '1500.00'
$r_price = '$ 85.95' or '1,500'

但是所有这些价格都是相同的,应该匹配。

我有一个正则表达式可以执行此操作,但不知道这是否是我们的操作方式:

(\d+)*(,)?\d+(.)?\d*

3 个答案:

答案 0 :(得分:3)

要从PHP字符串中检索和解析浮点数,请使用floatval()方法。

对于符号,取决于您是否始终对货币使用相同的约定(逗号表示千位分隔符,点表示小数位)。在这种情况下,您应该使用preg_replace()方法(点正则表达式可以为/[^0-9.]/)除去点以外的非数字

<?php

function sanitize($price) {
    return floatval(preg_replace('/[^0-9.]/', '', $price));
}

$a1 = '85.95';
$a2 = '1500.00';
$b1 = '$ 85.95';
$b2 = '1,500';

sanitize($a1); // (float) 85.95
sanitize($a2); // (float) 1500
sanitize($b1); // (float) 85.95
sanitize($b2); // (float) 1500

sanitize($a1) === sanitize($b1); // (bool) true
sanitize($a2) === sanitize($b2); // (bool) true
sanitize($a1) <= sanitize($a2); // (bool) true
sanitize($b1) >= sanitize($b2); // (bool) false

希望这会有所帮助!

答案 1 :(得分:0)

使用?*的模式中有很多可选部分,如果您不在代码中引用捕获组,则可以省略捕获组。

您可能要做的是匹配一个美元符号的可选部分,后跟0+个水平空格字符。

然后匹配1+位数字,后跟可选部分以匹配点或逗号和1+位数字

(?<!\S)(?:\$\h*)?\d+(?:[,.]\d+)\b

说明

  • (?<!\S)声明左侧的内容不是非空白字符
  • (?:\$\h*)?(可选)匹配一个美元符号和0+个水平空格字符
  • \d+(?:[,.]\d+)匹配1位以上的数字,后跟可选部分以匹配点或逗号和1位以上的数字
  • \b单词边界,以防止数字成为大单词的一部分

Regex demo | Php demo

答案 2 :(得分:-3)

您将数字存储为整数或浮点数
并进行比较,您需要使用||不是还是

希望有帮助